JavaFx警报对话框在渲染时出现问题

时间:2016-08-10 18:46:13

标签: java javafx javafx-2 javafx-8

我不确定我在以下代码中做错了什么。当我点击“按下我!”时,警告框不会渲染大约1次。我运行代码后的第一次。每次我点击按钮后它都会很好。要测试代码,您可能需要多次运行此代码。有人可以通过代码了解为什么会发生这种情况。

我正在使用: java版“1.8.0_101” Java(TM)SE运行时环境(版本1.8.0_101-b13) Java HotSpot(TM)64位服务器VM(版本25.101-b13,混合模式)

操作系统:ubuntu 16.04 LTS

以下是代码:

package javaapplication;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class JavaApplication extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        Font font = new Font(40);
        Text helloWorldText1 = new Text("Hello World from ");
        Text helloWorldText2 = new Text("JavaFX!!");
        helloWorldText1.setFont(font);
        helloWorldText2.setFont(font);
        helloWorldText2.setFill(Color.RED);
        HBox hBox1 = new HBox(helloWorldText1, helloWorldText2);

        HBox hBox2 = new HBox(20);
        Button okButton = new Button("PRESS ME!");
        okButton.setOnAction(e -> {
            Platform.runLater(() -> {
                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setContentText("You pressed OK!");
                alert.showAndWait();
            });
        });

        Button cancelButton = new Button("CANCEL!!");
        cancelButton.setOnAction(e -> System.exit(0));
        hBox2.getChildren().addAll(okButton, cancelButton);
        hBox2.setAlignment(Pos.BOTTOM_RIGHT);

        VBox vBox = new VBox(10);
        vBox.getChildren().addAll(hBox1, hBox2);
        vBox.setAlignment(Pos.CENTER);
        vBox.setPadding(new Insets(20));
        primaryStage.setScene(new Scene(vBox));
        primaryStage.show();
    }
}

提前感谢您的所有建议。

编辑:

我已在youtube video上传了一段视频,其中显示了该行为。请看看你是否观察到同样的情况。 在这个视频中,我还删除了Platform.runLater(...),以显示渲染问题不会消失!

2 个答案:

答案 0 :(得分:0)

Iv在windows,manjaro linux和lubuntu上测试了应用程序,但不是ubuntu本身和iv没有问题...有时说我经历了linux和javafx的奇怪问题,特别是在图形方面,如全屏视图等

然而,由于我无法在任何操作系统上重新创建问题而进行了猜测,我已尝试过这一点:

  

方法Platform.runLater(java.lang.Runnable runnable)运行   在某些JavaFX应用程序线程上指定了Runnable   未来未指明的时间。

因此,你需要在窗口上出现延迟,例如在窗口加载时加载某些东西,然后可能只是尝试这个事件,这是无法理解的。

okButton.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
         Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setContentText("You pressed OK!");
        alert.showAndWait();
    }
});

为了提供更多信息,还有另一篇文章here,详细描述了会发生什么,但无论如何都是错误的引用:

  

请记住,在JavaFX上调用了按钮的onAction   线程,因此您实际上停止了5个UI线程   秒。

如果你真的需要在Javafx线程上调用事件,它们还提供了解决方法。希望这对您的项目有所帮助并祝您好运!

答案 1 :(得分:0)

我得运行你的程序。你的程序没有任何问题。你的电脑是延误的原因。