我正在尝试实现一个侦听器,以便在tableview中检索拖动列的旧索引和新索引。对于这篇文章,我试图尽可能地简化问题,但仍然有一个运行的例子。
我尝试了两种带有更改和拖动侦听器的方法。 对于更改侦听器,我无法检索拖动列的旧索引和新索引。我发现change.getFrom和change.getTo值独立于移动的列。 在setOnDragDropped函数中,DragEvent永远不会被触发。
package TableViewColExample;
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.input.DragEvent;
import javafx.stage.Stage;
public class TableViewExample extends Application {
public static void main(String[] args) {
launch(args);
}
final TableView<String[]> tableView = new TableView<String[]>();
@Override
public void start(Stage stage) {
TableColumn[] columns = {new TableColumn("c1"), new TableColumn("c2"), new TableColumn("c3"), new TableColumn("c4")};
tableView.getColumns().setAll(columns);
tableView.getColumns().addListener(new ListChangeListener() {
@Override
public void onChanged(Change change) {
change.next();
System.out.println("change.getFrom()"+change.getFrom()); //0 independent of moved column
System.out.println("change.getTo()"+change.getTo()); //4 independent of moved column
System.out.println("change.wasAdded()"+change.wasAdded()); //true
System.out.println("change.wasRemoved()"+change.wasRemoved()); //true
System.out.println("change.wasReplaced()"+change.wasReplaced()); //true
}
});
tableView.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
System.out.println("OnDragDropped") ;
}
});
stage.setScene(new Scene(tableView));
stage.show();
}
}
答案 0 :(得分:1)
您应该能够通过查看已删除和获取列表方法并进行比较来确定旧订单和新订单。这可能不是您正在寻找的,但可能有所帮助。
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
public class MainApp extends Application {
public static void main(String[] args) {
launch(args);
}
final TableView<String[]> tableView = new TableView<String[]>();
@Override
public void start(Stage stage) {
TableColumn[] columns = {new TableColumn("c1"), new TableColumn("c2"), new TableColumn("c3"), new TableColumn("c4")};
tableView.getColumns().setAll(columns);
tableView.getColumns().addListener(
new ListChangeListener() {
@Override
public void onChanged(Change change) {
change.next();
System.out.println("old list");
System.out.println(change.getRemoved());
System.out.println("new list");
System.out.println(change.getList());
}
});
System.out.println("initial list");
System.out.println(tableView.getColumns());
stage.setScene(new Scene(tableView));
stage.show();
}
}
答案 1 :(得分:0)
上面的答案打印引用而不是列表。这是打印完整列表的代码。
将矩阵转换为字符串:
public static String matrix2String (String[][] m){
String[] str = new String[m.length];
for(int i=0; i < str.length;i++){
str[i] = Arrays.toString(m[i]);
}
return(Arrays.toString(str));
}
侦听器中的修改代码:
table.getColumns().addListener(
new ListChangeListener() {
@Override
public void onChanged(Change change) {
change.next();
System.out.println("old list");
System.out.println(change.getRemoved());
List<TableColumn> removed = change.getRemoved();
ObservableList<String[]> items = table.getItems();
String[][] removedArray = new String[removed.size()][items.size()];
for (int i=0; i< removed.size(); i++){
TableColumn<String[], ?> column = removed.get(i);
for (int j=0; j< items.size(); j++) {
removedArray[i][j] = (String) column.getCellData(items.get(j));
//System.out.print(column.getCellData(item));
}
}
List<TableColumn> added = change.getList();
String[][] addedArray = new String[removed.size()][items.size()];
for (int i=0; i< added.size(); i++){
TableColumn<String[], ?> column = added.get(i);
for (int j=0; j< items.size(); j++) {
addedArray[i][j] = (String) column.getCellData(items.get(j));
}
}
System.out.println("removed");
System.out.println(matrix2String(removedArray));
System.out.println("added");
System.out.println(matrix2String(addedArray));
}
});