2015-11-03 21 views
0

我想實現一個偵聽器以便檢索tableview中拖動列的舊索引和新索引。對於這篇文章,我試圖儘可能簡化問題,並且仍然有一個運行的例子。JavaFX在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(); 
    } 
} 

回答

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

     } 
});