当前位置: 首页 > 知识库问答 >
问题:

如何在javafx[复制]中创建线程

郭洋
2023-03-14

我正在开发我的第一个应用程序,我的GUI部分使用javafx。在此代码中,按下按钮时,我正在尝试连接到邮件服务器:

public class SettingWindowController implements Initializable {
    @FXML
    TextField hostTextField;
    @FXML
    TextField loginTextField;
    @FXML
    TextField passwordTextField;
    @FXML
    TextField portTextField;
    @FXML
    Label statusConnectionOK;
    @FXML
    ChoiceBox choiceStore;

    public void pressConnect(ActionEvent actionEvent) throws InterruptedException {
        Task task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                saveProperty();
                CheckMailConnect connect = new CheckMailConnect();
                if (connect.checkConnect()) {
                    statusConnectionOK.setText("");
                    statusConnectionOK.setStyle("-fx-text-fill:green;");
                    statusConnectionOK.setText("Connection OK");
                } else {
                    statusConnectionOK.setText("");
                    statusConnectionOK.setStyle("-fx-text-fill:red;");
                    statusConnectionOK.setText("Connection failed");
                }
                return null;
            }
        };
        Thread th = new Thread(task);
        th.setDaemon(true);
        th.start();
    }
}

但我有一个问题:

异常线程"Thread-4"ase.handleIllegalStateException:不在FX应用程序线程上;当前线程=Thread-4在ase.java:204Tcom.sun.javafx.scene.control.skin.FxUserThread(Tkin.handle)在kin.java:49QuantumTcom.sun.javafx.scene.control.skin.FxUserThread(QuantumTase.lambda)在ase.java:197父$com.sun.javafx.scene.control.skin.ProposedChange(P82162992.call)在com.sun.javafx.scene.control.VetoableListD1.changedAll(VetoableListDecorator.java:113)在com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:108)在com.sun.javafx.scene.control.skin.LabeledSkinBase.update儿童(LabeledSkinBase.java:575)com.sun.javafx.scene.control.skin.LabeledSkinBjava.lang.控制属性变更(LabeledSkinBcom.sun.javafx.tk.)在oolkit.checkLabelSoolkit.java:204控制属性变更(LabelScom.sun.javafx.tk.quantum.)在oolkit.check行为行为SkinBoolkit.java:438$注册表变更列表61美元(行为SkinBjavafx.scene.)在2.on行为SkinBase$$Lambda122美元/arent.java:364(未知来源)com.sun.javafx.collections.MultipletyChangeListenerHandler$ecorator.set(MultipletyChangeListStringProperty. setValue(StringProperty. java: 65)在javafx.场景.控制。在com. help desk. gui.控制器上标记. setText(Labeled. java: 145)。在com. help desk. gui.控制器上设置WindowControlller1美元. call(SettinWindowController. java: 41)。在javafx. conflow设置WindowControlller1美元. call(SettinWindowController. java: 33)。任务$TaskCallable. call(Task. java: 1423)在java. util. conflow。未来任务. run(Future任务. java: 266)在java. lang。线程. run(Thread. java: 745)

请告诉我,我怎样才能修复这个错误?

谢谢,专家们。

但我不知道如何在我的应用程序中实现这一点。这是我打开新窗口的控制器:

public class Controller implements Initializable {
    @FXML
    private MenuItem itemSetting;
    @FXML
    private Stage stage;
    @FXML
    private Parent root;

    @FXML
    public void pressSettingItem(ActionEvent actionEvent) throws IOException {
        if (actionEvent.getSource() == itemSetting) {
            stage = new Stage();
            FXMLLoader loader = new FXMLLoader();

            loader.setLocation(Controller.class
                                         .getResource("/SettingsWindows.fxml"));

            root =  loader.load();
            stage.setScene(new Scene(root, 300,300));
            stage.setTitle("Setting mode");
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.showAndWait();
        }
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {}
}

也许我写这个应用程序是错误的:)

共有2个答案

昝存
2023-03-14

问题是,只允许JavaFX线程更改GUI元素。要将更改GUI的操作重定向回FX用户线程,请调用平台。runLater(Runnable r)。你可能还想看看这个问题。

还有另一种方法可以为FX用户线程创建线程,但这似乎是JavaFX中的一个错误,因此将来可能会得到修补。

法镜
2023-03-14

您没有从FX GUI线程更新GUI,这是不允许的。您需要使用以下内容:

Platform.runLater(new Runnable() {
      @Override
      public void run() {
         //Update your GUI here
      }
  });

要进一步阅读,请查看平台。runLater()

 类似资料:
  • 本文向大家介绍如何在JavaFX中创建RadioMenuItem?,包括了如何在JavaFX中创建RadioMenuItem?的使用技巧和注意事项,需要的朋友参考一下 菜单是提供给用户的选项或命令的列表,通常菜单包含执行某些操作的项目。菜单的内容称为菜单项,菜单栏包含多个菜单。 JavaFx支持三种菜单项,即-检查菜单项,自定义菜单项和单选菜单项。 RadioMenuItem RadioMenuI

  • 本文向大家介绍如何在JavaFX中创建ButtonBar?,包括了如何在JavaFX中创建ButtonBar?的使用技巧和注意事项,需要的朋友参考一下 以下示例演示了ButtonBar的创建。 输出结果

  • 本文向大家介绍如何在JavaFX中创建MenuButton?,包括了如何在JavaFX中创建MenuButton?的使用技巧和注意事项,需要的朋友参考一下 一个菜单 是呈现给用户的选项或命令的列表,通常菜单中包含的执行某些操作的项目。菜单的内容称为菜单项,菜单栏包含多个菜单。 通常,按钮在用户界面应用程序中进行控制,单击该按钮将执行相应的操作。 MenuButton是一个简单的按钮,在单击它时显示

  • 本文向大家介绍如何在JavaFX中创建ProgressIndicator?,包括了如何在JavaFX中创建ProgressIndicator?的使用技巧和注意事项,需要的朋友参考一下 以下示例演示了 ProgressIndicator的创建。 输出结果

  • 本文向大家介绍如何在JavaFX中创建SplitMenuButton?,包括了如何在JavaFX中创建SplitMenuButton?的使用技巧和注意事项,需要的朋友参考一下 一个菜单是呈现给用户的选项或命令的列表,通常菜单中包含的执行某些操作的项目。菜单的内容称为菜单项,菜单栏包含多个菜单。 通常,按钮在用户界面应用程序中进行控制,单击该按钮将执行相应的操作。 甲SplitMenuButton提

  • 本文向大家介绍如何在JavaFX中创建SplitPane?,包括了如何在JavaFX中创建SplitPane?的使用技巧和注意事项,需要的朋友参考一下 以下示例演示了SplitPane的创建。 输出结果