0

我在 aTableColumn的 a中有一个单元格的索引(作为整数) TableView。使用单元格的索引,如何访问该索引处的单元格对象?我错过了类似的东西

tableColumn.getCells()

这将允许我访问具有给定索引的单元格:

tableColumn.getCells().get(index)

对此有任何提示吗?谢谢!

更新:

根据要求,一个用例:

想象一个音乐播放列表。出于某些原因,我为此使用 TableView,并且 TableView 尽可能大,这意味着即使播放列表中只有 5 首音乐曲目并且有 10 行的空间,那么 10 行(5 行,5 行)是显示。

然后我实现了拖放以重新排列项目。现在假设用户想要将第二个条目放在播放列表的末尾。他拖动第二个条目,但不是直接在最后使用的表格行上,而是在例如第 8 行。在这种情况下,我想给出一个视觉反馈,即音乐曲目放置在最后使用的行(第 5 行,但鼠标在第 8 行/单元格上!),所以我需要修改第 5 行/第 5 行,而鼠标在第 8 行上。知道哪一行是最后填充的行很容易 - 它是 tableview.getItems().size()- 1,但是获得对行/单元格 5 的引用是一件棘手的事情/我的问题。

4

2 回答 2

1

此 API 不存在是有原因的。

为了获得更好的性能,FXTableView自己操纵细胞。单元格的创建和销毁取决于 TableView 的当前可见部分和其他参数。甚至更多:在某些情况下,可以重用单元格对象来表示来自其他单元格的数据。

所以返回值tableColumn.getCells().get(index)是不确定的,因此没有 API 可以接收它。

所有与单元格相关的逻辑都应在CellFactory回调中实现。

你能描述一下你想通过访问单元来实现什么样的逻辑吗?

于 2013-04-25T15:39:45.700 回答
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);
    }

}
于 2014-06-13T04:22:39.580 回答