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

JavaFX-在fxml和update listview之间传递值

宇文育
2023-03-14
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.
    }
}

共有1个答案

李华茂
2023-03-14

要制作您想要的东西,您需要能够访问控制器(控制器本身必须能够相互通信)。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