Javafx项目有时会在警报时冻结

Javafx项目有时会在警报时冻结,java,javafx,manjaro,Java,Javafx,Manjaro,我正在使用Eclipse为我的大学课程编写javafx代码。当我在Eclipse中运行代码时,或者在将代码导出为jar文件后,程序有时会冻结 例如: 用于数据输入的普通框: 我有一个窗口,可以在其中输入矩形的值 如果在不添加两个值的情况下按“submit”,则会出现NumberFormatException,如下所示: catch (NumberFormatException ex) { System.err.println("NumberFormat

我正在使用Eclipse为我的大学课程编写javafx代码。当我在Eclipse中运行代码时,或者在将代码导出为jar文件后,程序有时会冻结

例如:

用于数据输入的普通框:

我有一个窗口,可以在其中输入矩形的值

如果在不添加两个值的情况下按“submit”,则会出现NumberFormatException,如下所示:

        catch (NumberFormatException ex) {
        System.err.println("NumberFormatException: " + ex.getMessage());
        Alert alert = new Alert(AlertType.ERROR, "Bitte alle Felder ausfüllen", ButtonType.OK);
        alert.showAndWait();
警报窗口有时会出现并正常工作。有时(很少)它会连续做10次。其他时候我会这样:

错误状态:

程序现在已冻结,无法单击任何内容。其中一个文本字段中有一条细黑线。程序永远不会恢复,必须通过Eclipse或任务管理器手动终止

这有时发生在第一次单击提交时。有时在5号或更晚。但这终究会发生。只要不经常触发此警报,该程序在所有其他情况下都可以正常工作

我在另一个项目中也遇到过这种情况,触发器是打开数据输入的一个新窗口,很像我在这里看到的窗口,但这次,只有警报冻结了程序。数据输入窗口可以打开任意次数

我在Manjaro上的Eclipse中使用(课程要求的)JavaFX11和JavaSE-11

最小可复制示例:

package application;
    
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.GridPane;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            GridPane root = new GridPane();
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            Button submit = new Button("submit");
            Alert alert = new Alert(AlertType.ERROR, "Bitte alle Felder ausfüllen", ButtonType.OK);
            submit.setOnAction(e -> alert.show());
            root.add(submit,0,0);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
只需单击“提交”按钮即可打开一个简单的网格窗格。如果我单击它,它有时会显示警报,但它通常会冻结,如上所述。我在冰箱里看不到任何图案。这并不总是第一次,也不总是第二次。有时是即时的,有时是3到4次,然后在下一次提交时冻结

控制台中没有错误消息

编辑:进一步的实验表明,窗口不会冻结。如果你点击return,它会点击警报中的按钮,关闭它,让我使用程序的其余部分


因此,错误似乎出现在没有正确显示的窗口中,只显示为一条细黑线。这仍然是一个问题,因为在我不能直接按enter键关闭的窗口中也会发生这种情况,这使我陷入困境。

原来就是这里描述的问题:

Plasma KDE有一个bug,它阻止这些类型的窗口打开。如果这是一次性的事情,会有一个变通办法


我通过切换到xfce解决了这个问题。

请..最小可复制示例添加我认为您应该在平台中创建一个函数包装警报。稍后运行(()->…)并提交按钮调用它。这是因为阻止了UI thread.worksforme(fx16++dev)-在点击10-20次后失去了耐心。@AmirRezaMohammadi为什么要这样做?警报只是专门的对话框——因此,它们设计为在没有线程特技的情况下工作。