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

在JavaFX/FXML/SceneBuilder中在屏幕之间传递参数

奚飞星
2023-03-14

我试图使用SceneBuilder和FXML构建一个简单的概念验证程序,由两个屏幕组成。第一个屏幕只是一个文本字段和一个按钮,它将您带到第二个屏幕,第二个屏幕只有一个标签,理想情况下,它将显示文本字段中的任何内容,当按钮被点击时。每个屏幕都有自己的FXML文件和自己的控制器。我读了很多关于FXMLLoader的文章,因为我的研究表明这是完成这一任务的理想方法,但我似乎仍然不知道如何正确地使用它。最后,我希望在角色扮演游戏的“角色创建”游戏前屏幕中实现这一点,在此,玩家的统计卷/库存选择从初始屏幕移动到用于计算/处理的模型,或者到用于显示的第二个屏幕控制器。

共有1个答案

左丘耀
2023-03-14

好吧,这是一种回答,请耐心听我说,我找到了一个Sahil Huseynzade的视频,我想它最终为我点击了。我在想,我可以将FXMLLoader几乎作为一种导入来使用,我可以在创建我的控制器的过程中以某种方式使用它,以便随意访问其他控制器。我在下面复制了一些使用FXMLLoader的代码,并附上了一些关于我认为FXMLLoader是如何工作的注释。抱歉,如果从技术的角度来看,这些解释是迟钝的或者措辞不佳的,或者如果我在整个过程中都是一个新手/笨蛋。我确实有一个进一步的问题,但我希望它是不好的形式,问它在一个答案,有没有一种方法使它,使信息是动态更新的跨窗口?比如我可以让一个窗口有一个骰子滚动按钮,谁的结果出现在另一个窗口自动?

package twoscreentest;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class Screen1Controller implements Initializable {

    @FXML
    public Label label;
    @FXML
    public Button button;
    @FXML
    private TextField textCharName;

    public String testtext;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        label.setText(Byte.toString((byte) (Math.floor(Math.random()*6)+1)));
    }    

    @FXML
    private void btnSend(ActionEvent event) throws IOException {
        PlayerInfo player = new PlayerInfo(textCharName.getText(), Double.parseDouble(label.getText()));  // Creating the temporary container.
        //((Node)event.getSource()).getScene().getWindow().hide(); This is to close the previous window, for testing it was easier to disable it.
        FXMLLoader loader = new FXMLLoader(); // Creating a the FXMLLoader
        loader.setLocation(getClass().getResource("Screen2.fxml")); // Telling it to get the proper FXML file.
        loader.load(); // Loading said FXML.
        Parent p = loader.getRoot(); // Setting up the window, I think I get how this works,
        //probably...
        Stage stage = new Stage();
        stage.setScene(new Scene(p));
        Screen2Controller screen2controller = loader.getController(); // This right here I 
        //don't entirely get, I know that I'm using the loader to get the controller, but
        //what's with the "NameofControllerClass variablename"?
        screen2controller.setCurrentInfo(player); // Setting the empty container in
        // the second class' variables to the ones in the the temporary container that
        // I created earlier.
        screen2controller.testlabel.setText(testtext); // An additional test, setting a label
        // on the second screen to a variable I set in this controller with a separate button.
        stage.show(); // Create the second screen.

    }

    @FXML
    private void btnSend2(ActionEvent event) {

        testtext = "Hello world";
    }

}
 类似资料:
  • voneController.java VotwoController.java

  • 问题内容: 如何将参数传递给javafx中的辅助窗口?有没有办法与相应的控制器通信? 例如:用户从中选择一个客户,TableView然后会打开一个新窗口,显示该客户的信息。 newStage将是新窗口。问题是,我找不到告诉控制器在哪里寻找客户信息的方法(通过将id作为参数传递)。 有任何想法吗? 问题答案: 推荐方法 该答案列举了将参数传递给FXML控制器的不同机制。 对于小型应用程序,我强烈建议

  • 如何在JavaFX中将参数传递给辅助窗口?有没有办法与相应的控制器进行通信? 例如:用户从中选择一个客户,然后打开一个新窗口,显示该客户的信息。 将是新窗口。问题是,我找不到一种方法告诉控制器在哪里寻找客户的信息(通过将id作为参数传递)。 有什么想法吗?

  • 相关问题: 在Flutter中在小部件之间传递数据的最佳方式 在小部件之间抖动传递数据? 颤振/如何在StateFulWidget之间传递和获取数据

  • 我的任务是在javafx中单击3个按钮时调用一个方法,该方法执行的代码只需更改所单击按钮的颜色。 根据场景,我在fxml中创建了3个按钮,并在控制器中定义了一个方法。我的任务代码很简单 现在请您告诉我如何才能获得被点击的特定按钮ID。这里myButton是被点击的按钮的fx: id。 提前谢谢。

  • 问题内容: 我想单击一列并将单元格索引发送到新阶段。但是我无法将参数()传递给另一个控制器。我已经尝试了所有方法,但仍然无法正常工作。 主控制器 EditClientController 问题答案: 如果要在FXML文件中指定控制器(因此您不能使用Deepak的答案), 并且 要访问方法中的索引(因此您不能使用José的答案),则可以使用控制器工厂: