Comment puis-je Changer FXML Contrôleur des Valeurs de Variables dans JavaFX avant d'afficher la Fenêtre?
Je veux changer les étiquettes et le texte dans une pop-up FXML
fenêtre avant qu'il est indiqué. Ceci est fait parce que tous les Aider articles seront très similaires, et je voulais faire un modèle FXML
et ensuite modifier les valeurs des étiquettes et de la zone de texte en conséquence de réduire le codage.
Je suis surpris, je n'ai pas trouver un modèle de méthode dans JavaFX
. Si il ya une meilleure façon d'aller à ce sujet, s'il vous plaît ne le suggèrent.
Pour la tâche à portée de main, j'ai le texte suivant:
@FXML
private void documentationAction(ActionEvent action) throws IOException {
Stage dialogue = new Stage();
Parent root = null;
FXMLLoader loader = new FXMLLoader();
root = loader.load(getClass().getResource("dialogues/dialogue.fxml"));
Scene scene = new Scene(root);
/*
* change text values in title (Label) and text (TextArea)
* and change the behavior of the findMore button
*/
dialogue.setTitle("Documentation");
dialogue.setScene(scene);
dialogue.show();
}
Je voudrais être en mesure de modifier les variables à l'intérieur de la FXM
L fichier, pour lequel j'ai fait getters
et setters
dans la classe du contrôleur, mais je ne peux pas comprendre comment le faire.
Est-il un moyen? Il me semble qu'il serait nécessaire pour changer l'information entre les fenêtres multi-fenêtré applications, donc je suis sûr qu'il ya quelque chose de simple que je suis absent.
Mise à JOUR
Code de contrôleur:
public class DialogueController implements Initializable {
@FXML
private Button more;
@FXML
private Button close;
@FXML
private TextArea text;
@FXML
private Label title;
public TextArea getText() {
return text;
}
public void setText(String text) {
this.text.setText(text);
}
public Label getTitle() {
return title;
}
public void setTitle(String text) {
this.title.setText(text);
}
@FXML
public void closeAction(ActionEvent action) {
//get a handle to the stage
Stage stage = (Stage) close.getScene().getWindow();
//do what you have to do
stage.close();
}
@FXML
public void moreAction(ActionEvent action) {
}
@FXML
public void makeDocumentation(ActionEvent action) {
this.title.setText("Documentation");
}
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
Plein Dialogue FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" padding="$x1" prefHeight="500.0" prefWidth="400.0" styleClass="mainFxmlClass" xmlns:fx="http://javafx.com/fxml" fx:controller="pdbpro.dialogues.DialogueController">
<children>
<GridPane alignment="CENTER" prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<Label fx:id="title" alignment="CENTER_LEFT" prefWidth="-1.0" styleClass="title" text="Title" underline="false" visible="true" GridPane.columnIndex="0" GridPane.rowIndex="0">
<GridPane.margin>
<Insets fx:id="x1" />
</GridPane.margin>
</Label>
<TextArea fx:id="text" editable="false" focusTraversable="false" prefWidth="200.0" wrapText="true" GridPane.columnIndex="0" GridPane.rowIndex="1">
<GridPane.margin>
<Insets bottom="24.0" left="15.0" right="15.0" />
</GridPane.margin>
</TextArea>
<ToolBar GridPane.columnIndex="0" GridPane.rowIndex="2">
<items>
<Button fx:id="more" mnemonicParsing="false" text="Find more" />
<Button fx:id="close" mnemonicParsing="false" onAction="#closeAction" text="Close" />
</items>
<GridPane.margin>
<Insets bottom="14.0" />
</GridPane.margin>
</ToolBar>
</children>
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<padding>
<Insets fx:id="x1" />
</padding>
<rowConstraints>
<RowConstraints maxHeight="60.0" minHeight="60.0" prefHeight="60.0" valignment="CENTER" vgrow="NEVER" />
<RowConstraints maxHeight="1.7976931348623157E308" minHeight="50.0" prefHeight="0.0" vgrow="ALWAYS" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
</GridPane>
</children>
<stylesheets>
<URL value="@dialogue.css" />
</stylesheets>
</AnchorPane>
Plein de trace de pile d'erreur lors de ces lignes
FXMLLoader loader = new FXMLLoader();
Parent root = loader.load(getClass().getResource("dialogues/dialogue.fxml"));
DialogueController dc = loader.getController();
dc.makeDocumentation(); //ERROR
Scene scene = new Scene(root);
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1440)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.control.MenuItem.fire(MenuItem.java:456)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1188)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(ContextMenuContent.java:1139)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(ContextMenuContent.java:1137)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3324)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3164)
at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3119)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1559)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2261)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:228)
at com.sun.glass.ui.View.handleMouseEvent(View.java:528)
at com.sun.glass.ui.View.notifyMouse(View.java:922)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1435)
... 37 more
Caused by: java.lang.NullPointerException
at pdbpro.MainController.documentationAction(MainController.java:82)
... 42 more
OriginalL'auteur calben | 2012-12-24
Vous devez vous connecter pour publier un commentaire.
D'une manière que je peux voir, c'est de faire de votre contrôleur de mettre en œuvre initializable et de mettre en œuvre la méthode initialize. La méthode initialize sera appelé automatiquement lorsque le contrôleur est créé par le fxml chargeur. Lorsque le inititialize méthode est appelée toutes les fxml objet déclaré doit être initialisé et prêt à être personnalisés.
[modifier]
Après la lecture de la docs pour initializable,
il est dit que si une méthode appelée initialiser sans args est créée, elle sera appelée automatiquement avec le fxml chargeur. Donc, à partir de ce que je comprends, vous n'avez pas besoin de mettre en œuvre initializable. Il suffit de créer une méthode initialize sans args.
Si nécessaire, des informations supplémentaires peuvent être trouvées dans une introduction au fxml.
Dans cette méthode vous souhaitez faire votre personnalisation que vous souhaitez. Vous pouvez appeler votre getters et les setters et de tout faire pour changer les étiquettes et tout ce que vous devez à partir de l'intérieur de la commande, puisque la méthode initialize est déjà à l'intérieur
Que serais-je passer à l'initialiseur d'indiquer quelles sont les valeurs que je veux régler lors de l'initialisation? Ou comment puis-je ajouter un autre paramètre à la méthode, dire une chaîne de caractères, pour indiquer ce que je veux les valeurs initialisées?
Vous ne pouvez pas passer à un autre paramètre. Ce que je voudrais faire est de créer un modèle pour le contrôleur et les paramètres que vous souhaitez, puis dans le inititialize méthode dans le contrôleur, il serait parler le modèle pour obtenir les valeurs dont elle a besoin
OriginalL'auteur Yarrgh
Essayez ceci:
Affirmer que la DialogueController dc n'est pas nulle. Et en supposant que le "titre" est un Label dans le fichier fxml avec
fx:id=titleLabel
, il se doit d'être soutenu dans votre contrôleur de classe comme suit:Avez-vous défini des fx:contrôleur d'attribut dans votre dialogue.fxml? Et le fait que le contrôleur de la méthode initialize d'exécuter pendant le chargement de dialogue.fxml?
Il semble tous être correctement initialisé et le contrôleur a été entièrement défini.
Ensuite, votre DialogueController ne doit pas être nul à la ligne dc.setTitle("titre");. Les entrées en phase nationale vient de setTitle() je suppose. Puis-je voir le code de contrôleur de classe au moins des getters/setters? Voir mise à jour.
code de réduction::
public class DialogueController implements Initializable { @FXML private Button more; @FXML private Button close; @FXML private TextArea text; @FXML private Label title; public TextArea getText() { return text; } public void setText(String text) { this.text.setText(text); } public void setTitle(String text) { this.title.setText(text); } @Override public void initialize(URL url, ResourceBundle rb) { } }
OriginalL'auteur Uluk Biy
Je vous suggère de masquer tous les FXML code de chargement de contrôleur. Pour cela, il est possible d'étendre une classe stage:
Contrôleur:
Appel de votre contrôleur:
OriginalL'auteur omelkova