Hallo zusammen,
ich habe in JavaFX ein paar Textfelder und einen Button nun will ich wenn man auf den Button klickt von allen Textfeldern einen Wert zurück bekommen! Ich habe das eben mit der
Code:
.getText();
Methode gemacht doch ich bekomme auch wenn ich etwas eingegeben habe null bzw "" zurück.
Woran kann das liegen?
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/package installer;importjava.io.File;importjava.net.URL;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.ResourceBundle;importjavafx.event.ActionEvent;importjavafx.fxml.FXML;importjavafx.fxml.Initializable;importjavafx.scene.control.TextField;importjavax.swing.JOptionPane;/**
*
* @author Lukas
*/publicclassStyleControllerimplementsInitializable{@FXMLpublicstaticTextField name;@FXMLpublicstaticTextField email;@FXMLpublicstaticfinalTextField serial1 =newTextField();@FXMLpublicstaticfinalTextField serial2 =newTextField();@FXMLpublicstaticfinalTextField serial3 =newTextField();privatestaticfinalString DIR ="C:\\Users\\"+System.getProperty("user.name")+"\\AppData\\Roaming\\";@FXMLprivatevoidabbrechen(ActionEvent event){if(JOptionPane.showConfirmDialog(null,"Wollen Sie das Setup wirklich abbrechen?","Setup Abbrechen",0)==0){System.exit(0);}else{}}@FXMLprivatevoidzuMaske1(ActionEvent event){Installer.maske1();}@FXMLprivatevoidzuMaske2(ActionEvent event){Installer.maske2();}privatestaticvoidtest(){
name.setText("NAME");}@FXMLprivatevoidinsallieren(ActionEvent event)throwsInterruptedException,SQLException{int state =0;if(name.getText().isEmpty()|| email.getText().isEmpty()){System.err.println(name.getText());System.err.println(email.getText());System.err.println(name.isDisabled());String name1 = name.getText();String email1 = email.getText();test();}else{File installation =newFile(DIR +"AB Cleaner");Dir.create(installation,Dir.DIRECTORY);String enterSerial = serial1.getText()+ serial2.getText()+ serial3.getText();Database db =newDatabase(JdbcTemplate.getInstance().getDataSource());
db.register(name.getText(), email.getText());ArrayList<String> serial = db.serial();for(String string : serial){if(string.equals(enterSerial)){
state =1;JOptionPane.showMessageDialog(null,"Ihr Produkt wurde erfolgreich aktiviert und wird nun installiert.");
db.deleteSerial(string);Installer.maske3();break;}else{
state =0;}}JOptionPane.showMessageDialog(null,"Ihr Aktivierungscode ist fehlerhaft. Prüfen Sie ihn auf Fehler oder erwerben Sie einen neuen");}}@FXMLprivatevoidmain(ActionEvent event){Installer.zumain();}@Overridepublicvoidinitialize(URL url,ResourceBundle rb){
name =newTextField();
email =newTextField();}}
und die dazugehörige Fxml Datei mit den TextFeldern und Buttons
[XML]<?xml version="1.0" encoding="UTF-8"?>
Hi,
Ich hab die Controiller- Klasse und das fxml- File mal angeschaut und daraus eine Version in Eclipse erstellt.
Java:
package application;/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/importjava.net.URL;importjava.util.ResourceBundle;importjavafx.event.ActionEvent;importjavafx.fxml.FXML;importjavafx.fxml.Initializable;importjavafx.scene.control.TextField;importjavax.swing.JOptionPane;/**
*
* @author Lukas
*/publicclassStyleControllerimplementsInitializable{@FXMLTextField name;@FXMLTextField email;@FXMLTextField serial1;@FXMLTextField serial2;@FXMLprivatevoidabbrechen(ActionEvent event){if(JOptionPane.showConfirmDialog(null,"Wollen Sie das Setup wirklich abbrechen?","Setup Abbrechen",0)==0){System.exit(0);}else{}}@FXMLprivatevoidzuMaske1(ActionEvent event){Installer.maske1();}@FXMLprivatevoidzuMaske2(ActionEvent event){Installer.maske2();}@FXMLprotectedvoidinstallieren(ActionEvent event){System.out.println(name.getText());}@FXMLprivatevoidmain(ActionEvent event){Installer.zumain();}@Overridepublicvoidinitialize(URL url,ResourceBundle rb){}}
<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="310.0" prefWidth="522.0000999999975" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="application.StyleController">
<children>
<TextField fx:id="name" layoutX="182.0" layoutY="108.0" prefWidth="326.0" />
<TextField fx:id="email" layoutX="182.0" layoutY="144.0" prefWidth="326.0" />
<TextField fx:id="serial1" layoutX="182.0" layoutY="181.0" prefWidth="103.0" />
<TextField fx:id="serial2" layoutX="294.0" layoutY="181.0" prefWidth="103.0" />
<TextField fx:id="serial3" layoutX="406.0" layoutY="181.0" prefWidth="103.0" />
<Button layoutX="271.0" layoutY="277.0" mnemonicParsing="false" onAction="#zuMaske1" text="Zurück" />
<Button layoutX="339.0" layoutY="277.0" mnemonicParsing="false" onAction="#installieren" text="Installieren" />
<Button layoutX="430.0" layoutY="277.0" mnemonicParsing="false" onAction="#abbrechen" text="Abbrechen" />
<Label layoutX="14.0" layoutY="14.0" text="Installer AB Cleaner - Konfiguration">
<font>
<Font name="System Bold" size="20.0" />
</font>
</Label>
<Label layoutX="14.0" layoutY="64.0" text="Registrieren Sie nun ihre Software:">
<font>
<Font size="13.0" />
</font>
</Label>
<Label layoutX="14.0" layoutY="111.0" text="Vor- und Nachname" />
<Label layoutX="14.0" layoutY="144.0" text="E-Mail Adresse" />
<Label layoutX="14.0" layoutY="181.0" text="Serial-Key" />
<Label layoutX="13.0" layoutY="236.0" prefWidth="495.0001220703125" text="Klicken Sie auf Installieren um fortzufahren oder auf Abbrechen um das Setup zu beenden" />
</children>
</AnchorPane>
[/XML]
Diese Version funktioniert und gibt in der Console den Text aus, der im Name- Feld eingegeben wurde, wenn auf Installieren gedrückt wird.
Die Probleme in deinem Code:
Java:
@Overridepublicvoidinitialize(URL url,ResourceBundle rb){
name =newTextField();
email =newTextField();}
Da du das Interface Initializable implementierst (mit der Methode initialize die implementiert wird) wird die Methode initialize vor dem Darstellen des Gui ausgeführt. Nun dies ist ok, aber du erstellst hier 2 Instanzen TextField... das ist nicht gut, denn alle componenten (textField, button RadioButton etc) welche im fxml deklariert werden, werden beim Start vom Controller automatisch geladen. Diese dürfen nicht manuell im Controller instanziert werden (naja, ausser man will dynamisch Components erstellen)
Weiter hast du, wie schon erwähnt ganz am Anfang vom Controller die textField definiert und erstellst dabei auch neue Instanzen.
Ersteinmal nennt man keine Methode "main". Das irritiert nur.
Zudem hast du das Prinzip von den "@FXML" nicht so wirklich verstanden. Du darfst du einzelnen Instanzvariablen nicht einfach instanziieren. (Okey, ich habe das selbst noch nie versucht, aber bin mir ziemlich sicher, dass es Murks ist).
Java:
@Overridepublicvoidinitialize(URL url,ResourceBundle rb){
name =newTextField();
email =newTextField();}
Wie genau nutzt du den Controller? Ich wette du nimmst nicht die load-Methode, sondern machst einfach ein "SytleController controller = new StyleController();"?
Danke knilch! Das instanziieren war das Problem jetzt klappt alles wieder!:toll::applaus:
Wie genau nutzt du den Controller? Ich wette du nimmst nicht die load-Methode, sondern machst einfach ein "SytleController controller = new StyleController();"?