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