public class MainController implements Initializable{
@FXML
private VBox v1;
@FXML
private VBox v2;
@Override
public void initialize(URL url, ResourceBundle rb) {
try {
v1.getChildren().add(FXMLLoader.load(getClass().getResource("voneFX.fxml")));
v2.getChildren().add(FXMLLoader.load(getClass().getResource("vtwoFX.fxml")));
} catch (IOException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
voneController.java
public class voneController {
@FXML private TextField txt1;
@FXML private Button btn1Send;
@FXML private void btn1SendClicked(ActionEvent event){
//Here i would like to call updateListView method
}
}
VotwoController.java
public class vtwoController{
@FXML
private ListView<ListModel> sampleListview;
ObservableList<ListModel> items = FXCollections.observableArrayList ();
public void updateListView() {
//This is the method which is called when user hit the button.
}
}
要制作您想要的东西,您需要能够访问控制器(控制器本身必须能够相互通信)。fxmlloader
提供了几个访问控制器的选项。第一个选项是将include
包含的fxml组件自动注入到fxml文件中。
<fx:include fx:id="childView" source="child.fxml"/>
为了注入控制器,child.fxml
中指定的控制器类型的字段必须使用fx:id
中指定的名称声明,该名称带有后缀controller。当然,还可以使用@fxml
进行注释。
public class MainController {
@FXML
private ChildController childViewController;
...
}
如果要使用动态变化的上下文,可以手动创建控制器并将其传递给fxmlloader
,后者将通过注入适当的字段或简单地获取初始化的实例来初始化它。
这里,首先调用fxmlloader#load()
,然后调用fxmlloader#getcontroller()
是很重要的。
FXMLLoader loader = new FXMLLoader(getClass().getResource("/resource/layout/child.fxml"));
Parent parent = loader.load();
ChildController controller = loader.getController();
手动创建控制器时,必须首先调用fxmlloader#setcontroller()
,然后调用fxmlloader#load()
。
ChildController controller = new ChildController();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/resource/layout/child.fxml"));
loader.setController(controller);
Parent parent = loader.load();
因此,管制员之间的沟通是微不足道的,我认为无须解释。
更新
对象之间如何进行通信的示例。这是使用该应用程序的两个视图:
child.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<HBox alignment="CENTER_LEFT" spacing="5.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.ChildController">
<children>
<Label text="Child View" />
<TextField fx:id="textField" HBox.hgrow="ALWAYS" />
<Button mnemonicParsing="false" text="Send to parent" onAction="#handleSendButton"/>
</children>
</HBox>
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" spacing="5.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.MainController">
<children>
<HBox spacing="5.0">
<children>
<TextField fx:id="textField" editable="false" HBox.hgrow="ALWAYS" />
<Button mnemonicParsing="false" text="Refresh" onAction="#handleRefreshButton"/>
</children>
</HBox>
<HBox fx:id="childContainer">
<fx:include fx:id="childView" source="child.fxml" />
</HBox>
</children>
</VBox>
public class ChildController {
@FXML
private TextField textField;
private Consumer<String> consumer;
public void addConsumer(Consumer<String> consumer) {
this.consumer = consumer;
}
@FXML
private void handleSendButton(ActionEvent event) {
if(consumer == null) {
return;
}
consumer.accept(textField.getText());
}
}
public class MainController {
@FXML
private TextField textField;
@FXML
private HBox childContainer;
@FXML
private ChildController childViewController;
@FXML
private void initialize() {
childViewController.addConsumer(textField::setText);
}
@FXML
private void handleRefreshButton(ActionEvent event) {
try {
textField.setText("");
FXMLLoader loader = new FXMLLoader(getClass().getResource("child.fxml"));
Parent parent = loader.load();
childViewController = loader.getController();
childViewController.addConsumer(textField::setText);
childContainer.getChildren().setAll(parent);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
我的任务是在javafx中单击3个按钮时调用一个方法,该方法执行的代码只需更改所单击按钮的颜色。 根据场景,我在fxml中创建了3个按钮,并在控制器中定义了一个方法。我的任务代码很简单 现在请您告诉我如何才能获得被点击的特定按钮ID。这里myButton是被点击的按钮的fx: id。 提前谢谢。
我试图使用SceneBuilder和FXML构建一个简单的概念验证程序,由两个屏幕组成。第一个屏幕只是一个文本字段和一个按钮,它将您带到第二个屏幕,第二个屏幕只有一个标签,理想情况下,它将显示文本字段中的任何内容,当按钮被点击时。每个屏幕都有自己的FXML文件和自己的控制器。我读了很多关于FXMLLoader的文章,因为我的研究表明这是完成这一任务的理想方法,但我似乎仍然不知道如何正确地使用它。最
问题内容: 如何将参数传递给javafx中的辅助窗口?有没有办法与相应的控制器通信? 例如:用户从中选择一个客户,TableView然后会打开一个新窗口,显示该客户的信息。 newStage将是新窗口。问题是,我找不到告诉控制器在哪里寻找客户信息的方法(通过将id作为参数传递)。 有任何想法吗? 问题答案: 推荐方法 该答案列举了将参数传递给FXML控制器的不同机制。 对于小型应用程序,我强烈建议
如何在JavaFX中将参数传递给辅助窗口?有没有办法与相应的控制器进行通信? 例如:用户从中选择一个客户,然后打开一个新窗口,显示该客户的信息。 将是新窗口。问题是,我找不到一种方法告诉控制器在哪里寻找客户的信息(通过将id作为参数传递)。 有什么想法吗?
我试图在JavaFX中的场景之间传递一个字符串,我已经遵循了一些答案,但似乎它们不起作用,因为字符串在新场景中是空的。 另一个: 正如你所看到的,我尝试使用一个控制程序,并使用一个集合来填充字符串,问题是当我打开新场景时,他的控制程序重置,字符串不再存在,知道为什么或如何解决这个问题吗?
我有一个JPanel表单,其中包含一个JList和一些JButton。JPanel看起来像这样 当我单击Add List按钮时,会显示一个单独的JFrame表单。JFrame表单将如下所示 单击JFrame上的add按钮时,我需要将JTextfield(命名列表名)的值添加到上一个JPanel上的JList。我想知道如何将值从JFrame传递到JPanel?如有任何建议,将不胜感激。 下面是 JP