TableView 的 ItemProperty() 的侦听器不会失效(javafx)?

文森特·巴顿斯

我试图让程序在 TableView 中添加一行时做出反应,但是当列表更改时 ItemProperty 不会通知侦听器。

我认为这可能是因为我没有“设置”这些项目(作为一个新的不同列表),只是添加到列表中,但我不确定。

我在 stackoverflow 上找到了这个,但我认为这不是同一个问题(或者至少该解决方案对我不起作用)。

有什么方便的方法来解决这个问题吗?

最小的可重现示例:

import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.Random;

public class Main extends Application {

    private static Random RG = new Random();

    @Override
    public void start(Stage stage) throws Exception {
        VBox vBox = new VBox();

        TableView<Integer> integerTableView = new TableView<>();
        TableColumn<Integer, Integer> testColumn = new TableColumn<>("test");
        testColumn.setCellValueFactory(i -> new SimpleIntegerProperty(i.getValue().intValue()).asObject());

        integerTableView.getColumns().add(testColumn);

        Button button = new Button("Add random number");
        button.setOnAction(e -> {
            integerTableView.getItems().add(RG.nextInt());
        });

        vBox.getChildren().addAll(integerTableView, button);
        Scene scene = new Scene(vBox);
        stage.setScene(scene);
        stage.show();

        integerTableView.itemsProperty().addListener(e -> System.out.println("Added item"));
    }

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

您正在将 添加InvalidationListeneritems属性中,该属性是ObjectProperty. 该属性上的侦听器将不知道它包含的值何时发生变化(它甚至不知道它的值是否/何时是可观察的)。您需要将侦听器添加到ObservableList自身。

integerTableView
    .getItems()
    .addListener((Observable e) -> System.out.println("Items invalidated!"));

根据您的示例代码,您需要添加:

import javafx.beans.Observable;

到你的代码。

请注意,如果您替换列表(例如,integerTableView.setItems(newList)),那么您需要向新列表添加一个侦听器,以继续收到有关表项无效的通知。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章