在我的JavaFX FXML应用程序中,我希望当用户单击主窗口中某处的菜单项时弹出一个辅助窗口,以便用户可以在其中输入一些输入,然后在单击按钮时将其输入到应用程序中,辅助窗口将关闭。
那里的所有教程都有些偏离。他们描述了如何在纯JavaFX中执行此操作,这显然与您在FXML中使用的方式不同,或者他们解释了如何切换场景,从而关闭了旧的场景。我想这很简单,按照定义FXML布局及其Controller,用它们创建一个新的Scene,然后调用类似
theStage.showScene(userInputWindow);
但是有效的解决方案似乎要复杂得多,其背后的原因也与我的假设不同。例如,在this tutorial中,我真的不明白他们为什么将其放入其中,FXMLLoader()的实际作用,或者实际上我将如何适应当前的任务。此外,资源指出“舞台一次只能显示1个场景”。在我看来,JavaFX应用程序可能缺少像这样的琐碎功能:在不关闭旧窗口的情况下显示新窗口。也许我误解了舞台和场景是什么以及它们可以做什么。所以我需要知道:
如何在代码中达到上述效果?
解决方案背后的原因是什么?那里涉及的所有事情是什么?
参考方案
您只能在Stage
中显示一个场景,但是可以创建多个阶段。如果要在辅助窗口中使用fxml,则应使用控制器实例并以允许访问用户输入的方式设计控制器。您可以使用Stage.showAndWait
来“等待用户完成输入”。
例
申请开始方法
请注意,这里只是打开新窗口的按钮,但是您可以在菜单项的onAction
事件处理程序中使用类似的逻辑。 (在这种情况下,您需要使用someNode.getScene().getWindow()
来访问Stage.initOwner
的父窗口; someNode
是父窗口中的任意Node
;您可以从事件(((Node)event.getTarget())
)中获取节点。或使用您知道的场景中的节点;在InputController.submit
mealField
中用于此目的)
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Choose favorite meal");
Label label = new Label("I don't know your favorite meal yet!");
btn.setOnAction((ActionEvent event) -> {
FXMLLoader loader = new FXMLLoader(getClass().getResource("input.fxml"));
Scene newScene;
try {
newScene = new Scene(loader.load());
} catch (IOException ex) {
// TODO: handle error
return;
}
Stage inputStage = new Stage();
inputStage.initOwner(primaryStage);
inputStage.setScene(newScene);
inputStage.showAndWait();
String meal = loader.<InputController>getController().getMeal();
label.setText(meal == null ? "C'mon, tell me your favourite meal already!" : "Your favourite meal is "+meal+". Interesting!");
});
VBox root = new VBox(label, btn);
root.setSpacing(10);
root.setPadding(new Insets(10));
root.setPrefWidth(300);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
控制者
public class InputController {
@FXML
private TextField mealField;
private boolean mealChosen;
@FXML
private void submit() {
mealChosen = true;
mealField.getScene().getWindow().hide();
}
public String getMeal() {
return mealChosen ? mealField.getText() : null;
}
}
文件
<GridPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mypackage.InputController" vgap="10" hgap="10" >
<columnConstraints>
<ColumnConstraints prefWidth="150.0" />
<ColumnConstraints prefWidth="150.0" />
</columnConstraints>
<children>
<TextField GridPane.columnIndex="1" fx:id="mealField" onAction="#submit" />
<Button mnemonicParsing="false" text="Ok" GridPane.columnIndex="1" GridPane.rowIndex="1" onAction="#submit" />
<Label text="Your favourite meal" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</GridPane>
Java Double与BigDecimal - java我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…
当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…
Java-父类正在从子类中调用方法? - java抱歉,我还是编码的新手,可能还没有掌握所有术语。希望您仍然能理解我的问题。我想得到的输出是:"Cost for Parent is: 77.77" "Cost for Child is: 33.33" 但是,我得到这个:"Cost for Parent is: 33.33" "Cost f…
Java Map,如何将UTF-8字符串正确放置到地图? - java我有一个地图,LinkedHashMap更确切地说。我想在上面放一个字符串对象。然后,我读取此值以查看实际存储的内容。字符串本身具有非ASCII字符(西里尔文,韩文等)。将其放到地图上然后阅读后,这些字符将替换为??? s。一些代码:Map obj = new LinkedHashMap(); System.out.println("name: &…
HIbernate创建数据库表 - java我正在学习JPA-Hibernate。我正在关注这个article在Dog.java中,它被称为@Table(name = "dog")。 在persistence.xml中,我有以下内容<property name="hibernate.hbm2ddl.auto" value="create"…