【问题标题】:Problem with JavaFX pane.getChildren().remove() at lambdalambda 处的 JavaFX pane.getChildren().remove() 问题
【发布时间】:2020-04-15 14:02:35
【问题描述】:

我写了一段代码:

public class MousePosition extends Application {

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

    @Override
    public void start(Stage primaryStage) {
        Pane pane = new Pane();
        Text text = new Text();

        Scene scene = new Scene(pane, 300, 100);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Exercise 8");
        primaryStage.show();

        scene.setOnMouseReleased(e -> pane.getChildren().clear());

        scene.setOnMouseClicked(e -> {
            showCoordinates(pane, text, e);
        });

        scene.setOnMousePressed(e -> {
            showCoordinates(pane, text, e);
        });


    }

    private void showCoordinates(Pane pane, Text text, MouseEvent e) {
        text.setText("(" + e.getX() + ", " + e.getY() + ")");
        text.setX(e.getX());
        text.setY(e.getY());
        if (!pane.getChildren().contains(text))
            pane.getChildren().add(text);
    }
}

应该:

单击鼠标按钮时显示鼠标位置(参见 图 15.28a),另一个显示鼠标位置 鼠标按钮被按下并在鼠标按钮时停止显示 被释放了。

但我的 lambda 不起作用:

scene.setOnMouseReleased(e -> pane.getChildren().clear());

它什么也不做。 当我将其更改为 scene.setOnMouseReleased(e -> text.setText("")); 时,它也没有任何作用。但是当我使用scene.setOnMouseReleased(e -> System.out.println("0")); 时,它可以工作。

【问题讨论】:

  • 请包含整个程序。这是最小的,但它需要包含和 main() 以便我们可以看到它是如何被调用的,并使用调试器自己编译它。你让我们很难帮助到我们。
  • 仔细阅读图15.28a ..周围的文字

标签: java javafx lambda


【解决方案1】:

请尝试在 javafx 应用程序线程上的事件处理程序中显式更新 UI 组件:

scene.setOnMouseReleased(e -> Platform.runLater(() -> pane.getChildren().clear()));

https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 2011-11-03
    • 2012-01-16
    • 2022-06-11
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多