我不确定我在以下代码中做错了什么。当我点击“按下我!”时,警告框不会渲染大约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(...),以显示渲染问题不会消失!
答案 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)
我得运行你的程序。你的程序没有任何问题。你的电脑是延误的原因。