使用给定索引访问列的单元格?

时间:2013-04-25 14:35:02

标签: java javafx-2 tableview

我在TableColumn的{​​{1}}中有一个单元格的索引(作为整数)。使用单元格的索引,如何在此索引处访问单元格对象?我错过了像

这样的东西
TableView

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

tableColumn.getCells()

有关此的任何提示吗?谢谢!

更新

根据请求,这是一个用例:

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

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

2 个答案:

答案 0 :(得分:1)

此API因某种原因不存在。

为了获得更好的性能,FX TableView自行处理单元格。根据TableView的当前可见部分和其他参数创建和销毁单元格。更重要的是:在某些情况下,可以重复使用单元格对象来表示来自其他单元格的数据。

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

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

您能通过访问单元格来描述要实现的逻辑类型吗?

答案 1 :(得分: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);
    }

}