【问题标题】:Connecting Classes in JavaFX在 JavaFX 中连接类
【发布时间】:2017-09-25 20:48:40
【问题描述】:

我一直在研究 JavaFX,并试图弄清楚如何连接包中包含的类。我希望 MainController 类中的“text1btn”按钮将 MainController 类中的“scene1TextField”中的文本发送到 LeftTextArea 类中的 TextArea。我将不胜感激任何有关的cmets。谢谢你。

包装样本;

public class Main extends Application {

    public static BorderPane root = new BorderPane();

    public static BorderPane getRoot() {
        return root;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        URL url1 = getClass().getResource("../view/MainView.fxml");
        BorderPane bp1 = FXMLLoader.load(url1);

        URL url2 = getClass().getResource("../view/LeftTextArea.fxml");
        AnchorPane bp2 = FXMLLoader.load(url2);    
        root.setTop(bp1);
        root.setCenter(bp2);    
        primaryStage.setScene(new Scene(root, 500, 400));
        primaryStage.setResizable(false);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

包控制器;

public class MainController {    
    @FXML
    Button scene1btn;
    @FXML
    Button scene2btn;
    @FXML
    TextField scene1TextField;
    @FXML
    TextField scene2TextField;

    @FXML
    Button text1btn;
    @FXML
    Button text2btn;
    @FXML
    TextArea mainViewTextArea;


    @FXML
    public void initialize() {

    }

    @FXML
    public void text1btnClicked() {

    }

    @FXML
    public void text2btnClicked() {

    }

    @FXML
    private void scene1btnClicked() {    
        try {
            URL url1 = getClass().getResource("../view/LeftTextArea.fxml");
            AnchorPane bp1 = FXMLLoader.load(url1);
            BorderPane border = Main.getRoot();
            border.setCenter(bp1);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }    
    @FXML
    private void scene2btnClicked() {

        try {
            URL url2 = getClass().getResource("../view/RightTextArea.fxml");
            AnchorPane bp2 = FXMLLoader.load(url2);
            BorderPane border = Main.getRoot();
            border.setCenter(bp2);    
        } catch (IOException e) {
            e.printStackTrace();
        }    
    }    
}

包控制器;

public class LeftTextArea {    
    @FXML
    public TextArea leftTextArea;    
}

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    一种快速简单的方法是在MainController 中公开一个StringProperty,并在它更改时调用LeftTextArea 中的方法:

    public class MainController {  
    
        private final StringProperty text = new SimpleStringProperty();
    
        public StringProperty textProperty() {
            return text ;
        }
    
        // existing code ...
    
        @FXML
        public void text1btnClicked() {
            textProperty().set(scene1TextField.getText());
        }
    
        // ...
    }
    

    LeftTextArea

    public class LeftTextArea {    
        @FXML
        public TextArea leftTextArea;    
    
        public void setText(String text) {
            leftTextArea.setText(text);
        }
    }
    

    然后你就可以把它们绑在一起了

    @Override
    public void start(Stage primaryStage) throws Exception {
        URL url1 = getClass().getResource("../view/MainView.fxml");
        FXMLLoader loader1 = new FXMLLoader(url1);
        BorderPane bp1 = loader1.load();
        MainController mainController = loader1.getController();
    
        URL url2 = getClass().getResource("../view/LeftTextArea.fxml");
        FXMLLoader loader2 = new FXMLLoader(url2);
        AnchorPane bp2 = loader2.load();
        LeftTextArea leftTextArea = loader2.getController();
    
        mainController.textProperty().addListener((obs, oldText, newText) ->
            leftTextArea.setText(newText));
    
        root.setTop(bp1);
        root.setCenter(bp2);    
        primaryStage.setScene(new Scene(root, 500, 400));
        primaryStage.setResizable(false);
        primaryStage.show();
    }
    

    如果您最终需要多个类似这样的本质上在控制器之间共享的属性,您可能需要定义一个“模型”类将它们全部封装在一个地方,并将模型传递给控制器​​。见,例如JavaFX controller to controller - access to UI ControlsApplying MVC With JavaFx

    【讨论】:

      【解决方案2】:

      如果您想设置 LeftTextArea 类中的任何字段,只需在 Class LeftTextArea 中创建一个公共 setter 方法,例如

      public void setTextArea(Text text){
              //do what you want to do
      }
      

      然后用 LeftTextArea 类的对象调用 MainController 类的方法。喜欢 LeftTextArea leftTextArea = new LeftTextArea(); leftTextArea.setTextArea(text); //text is the desired you want to send

      【讨论】:

      • 嗨,IR 埃蒙。感谢您的评论。我确实多次尝试过这种方法,但我无法让它发挥作用。我想我在这里遗漏了一些我无法弄清楚的东西。如果按钮和文本区域属于一个类,我没有问题让它们一起工作,但是当它们属于不同的类时,这是一个问题。
      • 大概是 OP 想要更改现有文本区域中的文本,而不是在控制器类的任意新实例上调用该方法。
      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 2015-10-09
      • 1970-01-01
      • 2016-07-08
      • 2017-01-07
      • 2014-10-28
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多