Wie kann ein textfield aus fxml-Datei aktualisiert werden setText in der java-Datei?
Ich bin auf der Suche zum aktualisieren von text in einem textfield-basierten auf einen bestimmten Wert. Damit das Beispiel einfacher, ich habe mein Programm kleiner. Das problem scheint zu sein, wenn ich oben.setText("Das ist mein neuer Text");
Sah ich diese:
so ändern Sie den text des TextField im java fx 2
aber die Antwort scheint nicht sinnvoll. Ich weiß nicht, warum würden Sie initialisieren ein textfield, das bereits umgesetzt wurde. Egal, es hat nicht funktioniert.
Habe ich auch angeschaut:
NullPointerException (JavaFX-Label.setText())
Dies scheint das am nächsten zu dem, was ich denke, ist das Problem, aber wenn habe ich Folgendes bekomme ich eine Fehlermeldung. Nur für die übersichtlichkeit ist dies in der JavaFXApplication5 Klasse.
try {
FXMLLoader loader = new FXMLLoader(
getClass().getResource("FXML.fxml")
);
FXMLLoader.setController(this); //non-static method setController(Object)
//can not be referenced from static context ERROR****
Parent root = (Parent) loader.load();
/*Parent root = FXMLLoader.load(getClass().getResource("FXML.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("java code");
stage.show();
*/
}
Lesen auf dem internet habe ich gefragt, ob es eine race-condition: http://gotoanswer.stanford.edu/nullpointerexception_in_javafx_initialize_method-8807679/
Also habe ich versucht:
Platform.runLater(new Runnable() {
@Override public void run() {
top.setText("This is my new Text");
}
});
Aber das hat nicht funktioniert. Ich weiß, dass es sein kann, in Szene gesetzt Builder aber ich brauche eine Möglichkeit, dynamisch zu ändern, es basiert auf Werten, die von einer anderen Klasse. Ich kann herausfinden, wie man das Teil wenn ich nur herausfinden, wie zu setzen, um mit zu beginnen. Hoffentlich erklärt dies genug, etwas Hilfe zu bekommen.
FXMLController Class:
public class FXMLController implements Initializable {
@FXML private TextField top;
public FXMLController() {
System.out.println("Hi");
top.setText("This is my new Text"); //This breaks the program *********
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
FXML.fxml class:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="javafxapplication5.FXMLController">
<children>
<TextField fx:id="top" layoutX="171.0" layoutY="68.0" />
</children>
</AnchorPane>
JavaFXApplication5 class: //main class
public class JavaFXApplication5 extends Application {
@Override
public void start(Stage stage) throws Exception {
try {
Parent root = FXMLLoader.load(getClass().getResource("FXML.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("java code");
stage.show();
}
catch (Exception ex) {
Logger.getLogger(JavaFXApplication5.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String[] args) {
launch(args);
}
}
InformationsquelleAutor eckama | 2014-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht mit einem Konstruktor auf Ihrem controller-Klasse (
FXMLController
), da es initilized durch den FXMLLoader.Haben Sie Recht, der erste link hat die Frage falsch beantwortet, da das textfield-Objekt initialisiert wird (wegen der
@FXML
annotation) in diesem Prozess.Also für den Anfang können Sie einen text hinzufügen, um die textfield-innen
initialize
, wie es geladen wird, von Anfang an durch den loader, undtop
werden bereits instanziiert.Versuchen Sie das zuerst, mit deiner geposteten version von
JavaFXApplication5
, und überprüfen Sie, dass das funktioniert.Es gibt viele Möglichkeiten, um den Inhalt auf dem Feld, aber wenn Sie benötigen, um den text zu ändern-Feld von einer anderen Klasse, nur fügen Sie eine öffentliche Methode:
Als ein Beispiel, könnten Sie eine Instanz des Controllers in deiner main-Klasse, und verwenden Sie es zu und übergibt den Inhalt in das Textfeld ein, nach der Bühne gezeigt wird. Dies überschreibt den vorherigen Inhalt.
Es gibt einen Tippfehler in meinem code, es sollte gesagt
controller.setTopText("New Text");
(ich Mach es). Jetzt sollte es funktionieren, keine Notwendigkeit zu machentop
öffentlichkeit. Über der NPE, wo rufen Sie an setTopText aus?Ok es wurde eine lange Nacht anscheinend und ich habe die falsche Klasse. So Problem behoben schlecht Tippen. Ich kann Ihnen nicht genug danken für Ihre Zeit.
InformationsquelleAutor José Pereda