在JavaFX中连接类

时间:2017-09-25 10:39:59

标签: java javafx

我一直在研究JavaFX,并试图弄清楚如何连接包中包含的类。我想要" text1btn"来自MainController类的按钮,用于从" scene1TextField"发送文本。也可以在MainController类中使用LeftTextArea类中的TextArea。我将不胜感激。谢谢。

打包示例;

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;    
}

2 个答案:

答案 0 :(得分:1)

快速而简单的方法就是在StringProperty中公开MainController,当它发生变化时,请调用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

答案 1 :(得分:-1)

如果你想在类LeftTextArea中设置任何字段,只需在类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