2013-04-25 43 views
0

我有一個TableColumnTableView單元格的索引(整數)。使用單元格的索引,如何訪問此索引處的單元格對象?我失去了一些東西像使用給定索引訪問單元格的列?

tableColumn.getCells() 

那麼這將讓我在給定索引訪問單元:

tableColumn.getCells().get(index) 

對此有何提示?謝謝!

更新:

根據要求,一個用例是:

想象一下,一個音樂播放列表。由於某些原因,我使用的是TableView,而TableView儘可能大,這意味着即使播放列表中只有5首音樂曲目,並且有10行的空間,那麼10行(5填充,5空)是所示。

然後我實施拖動&下降重新安排項目。現在想象一下,用戶想要將第二個條目放到播放列表的末尾。他拖拽第二個條目,但不是直接在最後使用的表格行上,而是在例如第8行。在這種情況下,我想給出一個視覺反饋,即音樂曲目放在最後一個使用的行下(第5行,但鼠標在第8行!),所以我需要修改行/單元格5,而鼠標在第8行。知道哪一行是最後一個填充的行很容易 - 它是tableview.getItems()。size() - 1,但獲取行/單元格5的引用是一件棘手的事情/我的問題在這裏。

+0

這就是你需要的嗎? http://docs.oracle.com/javafx/2/api/javafx/scene/control/TableColumn.html#getCellData(int) – BobTheBuilder 2013-04-25 14:39:53

+0

謝謝,但不是,這給了我*單元格中的數據,但我需要對單元格本身的引用,所以我可以使用cell.setStyle(..) – 2013-04-25 14:42:21

+1

更改它的樣式我認爲,您應該從cellFactory添加cell.setStyle()的支持。當你將一個單元格工廠添加到列中時,在某個特殊列表中添加添加單元格的邏輯,或者如此。我不認爲有這樣的操作支持,因爲不會假設你在創建後直接使用數據表示(單元/行)組件。 – 2013-04-25 15:04:23

回答

1

此API不存在是有原因的。

爲了獲得更好的性能FX TableView單獨操作單元格。根據TableView當前可見部分和其他參數創建和銷燬單元格。甚至更多:在某些情況下,可以重複使用單元格對象來表示來自其他單元格的數據。

因此,返回值tableColumn.getCells().get(index)不是確定的,因此沒有API接收它。

所有與單元相關的邏輯都應該在CellFactory回調中實現。

你能描述一下你想通過訪問單元來實現什麼樣的邏輯嗎?

+0

我看到幾個關於使用單元格的請求。我們可能會考慮在某些方面訪問單元格的問題 – 2013-04-25 15:49:25

+0

我在原始問題中添加了一個用例,請讓我知道這是否可以理解(以及是否有比手動跟蹤所有單元格更好的方法) – 2013-04-25 17:50:13

0

我會設置一個固定的單元格大小,只需使用鼠標座標進行猜測。我只是將它添加到現有示例中,我確定它不太正確,但它顯示了這個想法。

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.chart.PieChart; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.control.cell.TextFieldTableCell; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.converter.NumberStringConverter; 

public class ChangePie extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     ObservableList<PieChart.Data> pieChartData 
       = FXCollections.observableArrayList(
         new PieChart.Data("Grapefruit", 13), 
         new PieChart.Data("Oranges", 25), 
         new PieChart.Data("Plums", 10), 
         new PieChart.Data("Pears", 22), 
         new PieChart.Data("Apples", 30)); 
     final PieChart chart = new PieChart(pieChartData); 
     chart.setTitle("Imported Fruits"); 

     final TableView<PieChart.Data> tv = new TableView(pieChartData); 
     tv.setEditable(true); 
     tv.setFixedCellSize(40); 

     tv.addEventHandler(MouseEvent.ANY, (MouseEvent evt) -> { 
      double y = 0; 
      int idx1 = 0, idx2 = 0; 
      if (evt.getEventType() == MouseEvent.MOUSE_PRESSED) { 
       y = evt.getY(); 
       idx1 = tv.getSelectionModel().getSelectedIndex(); 
      } else if (evt.getEventType() == MouseEvent.MOUSE_RELEASED) { 
       idx2 = (int) Math.round((evt.getY() - y)/40); 
       System.out.println("insert at " + idx2); 
       if (idx2 > 0) { 
        chart.setData(null); 
        PieChart.Data removed = pieChartData.remove(idx1); 
        pieChartData.add(Math.min(idx2, pieChartData.size() - 1), removed); 
       } 
      } 

     }); 

     TableColumn tc1 = new TableColumn("Name"); 
     tc1.setPrefWidth(100); 
     tc1.setCellValueFactory(new PropertyValueFactory("name")); 
     tc1.setCellFactory(TextFieldTableCell.forTableColumn()); 

     TableColumn tc2 = new TableColumn("Data"); 
     tc2.setPrefWidth(100); 
     tc2.setCellValueFactory(new PropertyValueFactory("pieValue")); 
     tc2.setCellFactory(TextFieldTableCell.forTableColumn(new NumberStringConverter())); 

     tv.getColumns().addAll(tc1, tc2); 
     Scene scene = new Scene(new VBox(chart, tv)); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 
相關問題