2013-04-25 72 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); 
    } 

} 
相关问题