【问题标题】:Using static method as JavaFX change listener使用静态方法作为 JavaFX 更改监听器
【发布时间】:2014-03-18 16:37:44
【问题描述】:

有人可以向我解释为什么这不起作用吗?

public class ListenerTest {
    public static void addListener(Node node) {
        node.visibleProperty().addListener(ListenerTest::handleVisibleChanged);
    }

    private static void handleVisibleChanged(ObservableValue<? extends Boolean> observable,
            Boolean oldValue, Boolean newValue) {
        // Do something
    }
}

如您所见,我使用 Java 8 方法引用将静态方法分配为 JavaFX 更改侦听器。它编译得很好,但是当可见属性更改时不会调用 handleVisibleChanged() 方法。

请不要提供解决方法或问我为什么要这样做。把它想象成一个练习。 :-)

【问题讨论】:

  • 这应该可以按预期工作-您确定属性已更改吗?您能否创建一个完整的示例来重现该问题?
  • @assylias:是的,我很确定该属性已更改。完整的示例可能需要一些时间。
  • 那么如果你在你的静态方法中放一个println,它不会打印任何东西?
  • @assylias:不,它没有。该方法肯定不会被执行。此外,不会引发错误。

标签: java javafx java-8


【解决方案1】:

这是一个使用您的两种方法并按预期工作的简单示例:单击按钮时,会打印一条消息。

public class ListenerTest extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Label label = new Label("You can see me");
        addListener(label);
        Button button = new Button("Hide/Show");
        button.setOnAction(e -> label.setVisible(!label.isVisible()));

        Scene scene = new Scene(new VBox(20, label, button));
        stage.setScene(scene);
        stage.show();
    }
    public static void addListener(Node node) {
        node.visibleProperty().addListener(ListenerTest::handleVisibleChanged);
    }
    private static void handleVisibleChanged(ObservableValue<?> a, Boolean b, Boolean newValue) {
        System.out.println("new value: " + newValue);
    }

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

【讨论】:

  • 好的,我现在明白了。您的示例有效,因为 node 与方法在同一个类中,而在我的情况下,该方法是从另一个类调用的。我需要公开 handleVisibleChanged 方法。傻我。
  • @NikšaBaldun 不,这不应该有所作为。
  • 实际上,它确实有所作为。我已经公开了这个方法,现在它可以工作了。可能归结为JavaFX调用方法的一种方式,但是我懒得看源代码。 :-)
  • 我无法重现——即使我将这两个静态方法放在一个单独的类中并将handleVisibleChanged 设为私有,代码仍然有效。
  • 奇怪。就我而言, addListener 方法是从另一个类调用的,而 node 是该类中的私有字段。只有当我公开 handleVisibleChanged 方法时它才有效。可能是我遗漏了一些东西,也可能是我的 JavaFX 版本中的错误。无论如何,我没有时间进一步调查。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
相关资源
最近更新 更多