【问题标题】:JavaFX and FXML - update label with data from another controllerJavaFX 和 FXML - 使用来自另一个控制器的数据更新标签
【发布时间】:2017-12-28 10:10:09
【问题描述】:

我有一个带有标签和按钮的窗口,以及另一个带有文本字段和按钮的窗口。从主窗口我想使用按钮打开另一个窗口,在新窗口的文本字段中输入一些内容,然后单击新窗口上的按钮后,我希望它关闭,主窗口标签用文本更新输入。我也希望新窗口是模态的。

Main Window

New Window

public class MainController {

    @FXML
    public void showNewWindow() {
        try {
            Stage newWindowStage = new Stage();
            newWindowStage.setTitle("New Window");
            newWindowStage.initModality(Modality.APPLICATION_MODAL);
            VBox root = FXMLLoader.load(getClass().getResource("newWindow.fxml"));
            Scene scene = new Scene(root);
            newWindowStage.setScene(scene);
            newWindowStage.showAndWait();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


public class NewWindowController {

    @FXML
    private TextField textField;

    @FXML
    public void updateMainWindowLabel() {
        // update label in main window
        // close new window
    }
}

我知道它根本没有设置好,但希望它能解释我想要做什么。

【问题讨论】:

    标签: java javafx fxml


    【解决方案1】:

    这是有效的示例代码(它不是最整洁的,所以我会很感激编辑)

    我对模态窗口没有完全了解,但here 我发现了另一个与此相关的问题。

    扩展应用程序的主类:

    public static void main(String[] args) {
        Application.launch(Test.class, args);
    }
    
    private static Stage stage1;
    private static Stage stage2;    
    private static MyExampleController controller;
    
    @Override
    public void start(Stage primaryStage) throws Exception {
        stage1 = primaryStage;        
        FXMLLoader loader1 = new FXMLLoader(Test.class.getResource("/test/MyExample.fxml"));
        AnchorPane pane1 = (AnchorPane)loader1.load();
        controller = loader1.getController();
        Scene scene1 = new Scene(pane1);
        stage1.setScene(scene1);
        
        stage2 = new Stage();
        FXMLLoader loader2 = new FXMLLoader(Test.class.getResource("/test/MyEx2.fxml"));
        AnchorPane pane2 = (AnchorPane)loader2.load();
        Scene scene2 = new Scene(pane2);
        stage2.setScene(scene2);
        
        stage1.show();
    }
      
    public static Stage getStage2(){
        return stage2;
    }
    
    public static MyExampleController getController(){
        return controller;
    }
    

    控制器类 1:

    public class MyExampleController implements Initializable {
    
    @FXML
    private Label labLab;
    @FXML
    private Button btnButton;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {       
    }    
    
    @FXML
    private void clickButton(ActionEvent event) {
        Test.getStage2().show();
    }
    
    public void updateLabel(String newLabelText){
       this.labLab.setText(newLabelText);
    }
    }
    

    控制器类 2:

    public class MyEx2Controller implements Initializable {
    
    @FXML
    private Button btnUpdate;
    @FXML
    private TextField txtField;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }    
    
    @FXML
    private void doUpdateForTitle(ActionEvent event) {
        Test.getController().updateLabel(txtField.getText());
        Test.getStage2().close();
    }
    
    }
    

    【讨论】:

      【解决方案2】:

      你需要 2 个阶段来做你想做的事(不仅仅是 2 个场景)。

      Stage st
      st.setOnCloseRequest(e -> {
      
      });
      

      将允许在您的舞台关闭时执行您想要的任何代码(您的新窗口)。

      然后在 TextField 对象上使用 getText() - 并在主舞台 Label 对象上使用 setText()

      st.initModality(Modality.APPLICATION_MODAL);
      

      ...将使其成为模态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-14
        • 2017-11-18
        • 2016-05-10
        • 2013-01-17
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多