【问题标题】:JavaFX retrieve index of dragged column in tableViewJavaFX检索tableView中拖动列的索引
【发布时间】:2015-11-03 18:35:53
【问题描述】:

我正在尝试实现一个侦听器,以检索 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();
  }
}

【问题讨论】:

    标签: java javafx tableview listener


    【解决方案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();
        }
    }
    

    【讨论】:

      【解决方案2】:

      上面的答案打印参考而不是列表。这是打印完整列表的代码。

      矩阵转字符串:

      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));
      
              }
      });
      

      【讨论】:

        猜你喜欢
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 2021-08-23
        • 2013-04-01
        • 2016-10-27
        • 2011-12-20
        相关资源
        最近更新 更多