Connexion de classes dans JavaFX


J'ai travaillé sur JavaFX et essayé de comprendre comment connecter les classes contenues dans le paquet. Je veux que le bouton " text1btn "de la classe MainController envoie un texte de" scene1TextField " également dans la classe MainController à TextArea dans la classe LeftTextArea. J'aimerais avoir des commentaires sur l'. Merci.

Échantillon de paquet;

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

Contrôleur de paquet;

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

Contrôleur de paquet;

public class LeftTextArea {    
    @FXML
    public TextArea leftTextArea;    
}
Author: Przemek, 2017-09-25

2 answers

Un moyen rapide et simple d'approche, c'est juste pour exposer un StringProperty dans le MainController, et quand il change appeler une méthode dans le 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());
    }

    // ...
}

Dans LeftTextArea faire

public class LeftTextArea {    
    @FXML
    public TextArea leftTextArea;    

    public void setText(String text) {
        leftTextArea.setText(text);
    }
}

Et puis vous pouvez lier le tout avec

@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();
}

Si vous finissez par avoir besoin de plusieurs propriétés comme celle-ci qui sont essentiellement partagées entre les contrôleurs, vous devez probablement définir une classe "model" pour les encapsuler toutes au même endroit et transmettre le modèle aux contrôleurs. Voir, par exemple, JavaFX contrôleur contrôleur-accès aux contrôles d'interface utilisateur ou En appliquant MVC avec JavaFX

 1
Author: James_D, 2017-09-25 12:48:40

Si vous souhaitez définir un champ dans la classe LeftTextArea, créez simplement une méthode de réglage public dans la classe LeftTextArea comme

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

Ensuite, appelez la méthode de la classe MainController avec l'objet de la classe LeftTextArea. comme LeftTextArea leftTextArea = new LeftTextArea(); leftTextArea.setTextArea(text); //text is the desired you want to send

 -1
Author: IR Emon, 2017-09-25 11:22:08