我正在开发我的第一个应用程序,我的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) {}
}
也许我写这个应用程序是错误的:)
问题是,只允许JavaFX线程更改GUI元素。要将更改GUI的操作重定向回FX用户线程,请调用平台。runLater(Runnable r)。你可能还想看看这个问题。
还有另一种方法可以为FX用户线程创建线程,但这似乎是JavaFX中的一个错误,因此将来可能会得到修补。
您没有从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的创建。 输出结果