Comment puis-je accéder à un élément d'INTERFACE utilisateur à partir d'un autre contrôleur de classe JavaFX?
J'ai un JavaFX /Java 8 application écrite avec NetBeans 8 (pas de SceneBuilder
).
Ma demande a une fenêtre principale qui dispose de son propre fichier FXML (primaire.fxml) et de son propre contrôleur de classe (FXMLPrimaryController.java). L'un des éléments dans le FXML est un TextArea
. Les méthodes de l'FXMLPrimaryController.java sont sur l'ajout à qui TextArea
.
Cette application génère désormais une deuxième fenêtre (une autre "scène"), avec son propre FXML (seconde.fxml) et de son propre contrôleur de classe (FXMLsecondController.java).
Dans le deuxième contrôleur de classe, comment puis-je accéder à la TextArea dans le primaire?
Voici un exemple de code:
primaire.fxml:
<Button text="press me!" onAction="#openSecondWindow" />
<TextArea fx:id="myArea" />
FXMLPrimaryController.java:
public class FXMLPrimaryController implements Initializable {
@Override
public void initialize(URL url, ResourceBundle rb) {
}
@FXML private TextArea myArea;
final public void writeToTextArea() {
myArea.appendText("hi!");
}
@FXML
private void openSecondWindow(ActionEvent event) throws Exception {
Group root = new Group();
Stage stage = new Stage();
AnchorPane frame = FXMLLoader.load(getClass().getResource("second.fxml"));
root.getChildren().add(frame);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
}
Il n'y a rien de compliqué à propos de second.fxml. Supposons qu'il existe un bouton avec onAction="#writeSomething"
.
Dans FXMLsecondController.java je voudrais une fonction qui fait référence ci-dessus TextArea
.
OriginalL'auteur adeena | 2014-02-24
Vous devez vous connecter pour publier un commentaire.
Lorsque vous chargez le FXML pour le contrôleur secondaire ce faire:
Ensuite, vous pouvez passer des références à la deuxième manette. Ce pourrait être simplement le TextArea.
EDIT:
Remplacé le
load()
appel dans l'extrait ci-dessus et ajouté lesetLocation()
appel. L'ancienne ligneAnchorPane frame = fxmlLoader.load(getClass().getResource("second.fxml"));
a été mal comme il appelle le statiqueload
fonction, ce qui est inutile ici.EDIT:
(Modifié l'extrait de code ci-dessus afin de mieux correspondre à vos noms de variable.)
L'extrait de code ci-dessus remplace cette partie de votre code:
Qui utilise la FXMLLoader pour charger la vue et aussi crée l'instance du contrôleur - dans ce cas
FXMLSecondaryController
. Cependant, vous ne pouvez pas utiliser la statiqueFXMLLoader.load
méthode pour cela, vous avez besoin d'une instance deFXMLLoader
. Cette instance contient une référence pour le contrôleur, après charge et vous pouvez les récupérer avecgetController()
. Et vous avez besoin de convertir la valeur retournée pour votre contrôleur de classe (avec(FXMLSecondaryController)
).Votre contrôleur principal dispose d'un champ:
Ceci est une référence à votre
TextArea
et est initialisé par le fxml chargeur. (Si vous supprimez le@FXML
annotation, le chargeur ne touche pas à ce.)Dans votre contrôleur secondaire, ajouter ce champ:
Noter que
@FXML
est parti (le fxml chargeur doit pas toucher le terrain) ainsi queprivate
(vous souhaitez définir le champ, donc les autres doivent le voir).Vous pouvez maintenant définir ce champ après que le contrôleur a été chargé. Donc, retour à la code de chargement:
EDIT: Remplacé le
load()
appel dans l'extrait ci-dessus et ajouté lesetLocation()
appel. L'ancienne ligneAnchorPane frame = fxmlLoader.load(getClass().getResource("second.fxml"));
a été mal comme il appelle le statiqueload
fonction, ce qui est inutile ici.La
FXMLSecondaryController
a maintenant une référence à laTextArea
de contrôleur principal. Dans l'une de ses méthodes, vous devriez être en mesure d'accéder à son contenu:Noter que cette solution n'est pas la meilleure approche, mais elle est simple et peut servir comme un début. À l'aide de la liaison est certainement recommandé. Je voudrais essayer de créer une classe qui contient les données et sur lequel les autres contrôleurs de liaison. Mais si vous prenez l'approche simple pour l'instant, il devrait être suffisant.
Lorsque vous chargez le contrôleur secondaire avec FXMLLoader.charge, vous pouvez changer de ligne et ajoutez le code de ma réponse. Vous pouvez également créer un champ dans votre contrôleur secondaire qui est titulaire d'un TextArea: "TextArea primaryTextArea;". Ainsi, lorsque vous créez le contrôleur secondaire de définir la primaryTextArea champ de monaire. Vous n'avez pas besoin d'une fonction de requête pour le TextArea; vous pouvez le transmettre lorsque vous créez le contrôleur secondaire.
Désolé, encore un peu confus. Si j'utilise votre code ci-dessus pour remplacer une partie du code où je suis chargé mon deuxième fenêtre/seconde FXML choses... alors je ne comprends pas ce que cette ligne: FXMLSecondaryController c = (FXMLSecondaryController) fxmlLoader.getController(); ou comment, quand je suis dans mon deuxième Controller.java comment je suis accéder à la zone de texte de la fenêtre principale? "c" n'est pas utilisable...? s'agit-il?
Si vous me donnez un peu de temps, je vais ajouter des informations de meilleure qualité plus tard. Actuellement, je suis sur mon iPhone et de l'édition est plutôt mal à l'aise ici 🙂 Pour l'instant: que ligne vous donne accès à la deuxième contrôleur dans lequel vous souhaitez accéder à la zone de texte. À l'intérieur du secondaire contrôleur, vous pouvez accéder à la TextArea juste avec le champ primaryTextArea.
Oui, prenez votre temps. Je vous remercie de votre aide! Je n'ai toujours pas été en mesure de celui-ci...
OriginalL'auteur Rainer Schwarze
J'espère que vous pourriez exposer le Champ de la FXMLPrimaryController, et ont un Champ de texte de la propriété dans le FXMLsecondController; puis définissez cette propriété lorsque vous vous assemblez les morceaux ensemble. Ce ne serait pas une bonne conception, bien que, parce que vous seriez en exposer les détails de la vue à travers les contrôleurs.
Je suis sûr que vous ne voulez pas le TextArea, mais les données de la TextArea dans
second.fxml
. Donc, ce que je suggère, c'est d'exposer une propriété de type Chaîne dans chacun des contrôleurs et les lie ensemble.et puis dans votre FXMLsecondController, vous pouvez avoir
Ensuite, vous pouvez lier ces deux, en utilisant quelque chose comme ce
Cette lie aujourd'hui la variable
text
de deux contrôleurs et vous pouvez facilement utiliser la valeur entrée dans le textarea du contrôleur principal dans votre contrôleur secondaire !Vous pouvez utiliser la propriété de liaison dans le openSecondWindow() de la vôtre !
Pourriez-vous nous invitez-les à un chat? J'ai quelques autres questions à propos de cette réponse.
OriginalL'auteur ItachiUchiha