# JavaFX TextArea.setText



## programmierer12 (25. Mai 2014)

Hallo zusammen,
ich habe ein Problem mit JavaFX ;( ! Ich habe mir eine Oberfläche programmiert und habe ein TextArea dessen Text ich während der Laufzeit ändern muss. Wenn ich mich nicht irre müsste das auch wie in Swing mit der 
	
	
	
	





```
.setText("Text")
```
 Methode funktionieren, oder?!
Dies habe ich nämlich getan und es passiert nichts. Ich habe auch schon überprüft ob der String den ich übergebe null ist, das hat sich aber nicht bewahrheitet. Nun weiß ich echt nicht mehr weiter ;(;(;( !!!

Falls ihr meinen Code braucht - Hier ist er :

```
private static void fragenStellen(){
        
        if (fragen.isEmpty()) {
            
            DialogFX fertig = new DialogFX(DialogFX.Type.INFO);
            fertig.setMessage("Deine Abfrage ist nun beendet");
            fertig.showDialog();

            Main.goToHauptmenue();
            
        }
        
        int letzteFrage = fragen.size();
        System.out.println("Letzte Frage :\t"+letzteFrage);
        int id = (int) (Math.random()*letzteFrage);
        
        System.out.println("Random :\t"+id);
        
        fragenID = id;
        
        txt_Frage_anzeige.setText(String.valueOf(fragen.get(id)));
        
        System.out.println("Frage gestellt :\t"+String.valueOf(fragen.get(String.valueOf(id))));
        
        fragen.remove(id);
        
    }
```
Das ist der Abschnitt in dem ich den Text ändern will.

MFG
programmierer12


----------



## knilch (25. Mai 2014)

Hi,
textArea.setText("Text") ist eigentlich richtig. Probiers doch mal, indem du: 
	
	
	
	





```
txt_Frage_anzeige.setText(String.valueOf(fragen.get(id)));
```
zu

```
txt_Frage_anzeige.setText("Text")
```
änderst. 
Wenn das ändert, dann bekommst du bei String.valueOf(fragen.get(id)) einen leeren String zurück... (nicht NULL)
Ansonsten poste doch mal den ganzen code...
gruss knilch


----------



## programmierer12 (25. Mai 2014)

Danke für deine Antwort aber ich bekomme einen String mit einem Wert zurück! Auch wenn ich einen Text einfüge erscheint dieser aber nicht.
Also hier der gesamte Code für die Main-Klasse:

```
*
 * 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 karteikasten;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author Lukas
 */
public class Main extends Application {
    
    private static Stage stage;
    
     @Override
   public void start(Stage primaryStage) throws Exception {
       
        stage = primaryStage;
        stage.setMinWidth(600);
        stage.setMinHeight(400);
        main();
        primaryStage.show();
        
}
   
   public void goToEingabe(){
       
       replaceSceneContent("eingabe-style.fxml");
       
   }
   
   public void goToAbfrage(){
       
       replaceSceneContent("abfrage-style.fxml");
       
   }
   
   public static void goToHauptmenue(){
       
       replaceSceneContent("start-style.fxml");
       
   }
   
   public void main() {
        try {
        
            Controller_01 start = (Controller_01) generateSceneContent("start-style.fxml");        
            
        } catch (Exception ex) {
        
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        
        }
    }
   
    private static Initializable replaceSceneContent(String fxml){
        
        FXMLLoader loader = new FXMLLoader();
        
        try {
            
        loader = new FXMLLoader();
        InputStream in = Main.class.getResourceAsStream(fxml);
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        loader.setLocation(Main.class.getResource(fxml));
        Parent page;
        try {
            page = (Parent) loader.load(in);
        } finally {
            in.close();
        }
        page.autosize();
        stage.getScene().setRoot(page);
        stage.sizeToScene();
        
        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
        
        return (Initializable) loader.getController();
    }
    
     private Initializable generateSceneContent(String fxml) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        InputStream in = getClass().getResourceAsStream(fxml);
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        loader.setLocation(Main.class.getResource(fxml));
        Parent page;
        try {
            page = loader.load(in);
        } finally {
            in.close();
        }
        Scene scene = new Scene(page, 800, 450);
        stage.setResizable(false);
        stage.setScene(scene);        
        stage.sizeToScene();
        stage.setTitle("Tutorio");
        return (Initializable) loader.getController();
        
    }

    /**
     * @param args the command line arguments
     * @throws java.io.IOException
     */
    public static void main(String[] args) throws IOException {
    
       Controller_01.init();
       launch(args);
    
    }
    
}
```

und meine Controller-Klasse:

```
/*
 * 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 karteikasten;

import Dialog.DialogFX;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextArea;
import javafx.scene.input.MouseEvent;
import javafx.scene.text.Text;

/**
 *
 * @author Lukas
 */
public class Controller_01 implements Initializable {
    
    public static final String DIR = "C:\\Users\\Lukas\\AppData\\Roaming\\Tutorio";
    
    private static int fragenID;
    
    private static final Properties inst = new Properties();
    private static final HashMap fragen = new HashMap();
    private static final HashMap antworten = new HashMap();

    private static final Properties newAntworten = new Properties();
    private static final Properties newFragen = new Properties();
    
    @FXML
    TextArea txt_Frage = new TextArea();
    @FXML
    TextArea txt_Antwort = new TextArea();
    @FXML
    static TextArea txt_Frage_anzeige = new TextArea();
    @FXML
    TextArea txt_Antwort_eingabe = new TextArea();
    
    Main con = new Main();
    
    public static void init() throws IOException{
        
        try {
            
            inst.load(new FileInputStream(new File(DIR + "\\install.config")));
            
        } catch (IOException ex) {
            
            Logger.getLogger(Controller_01.class.getName()).log(Level.SEVERE, null, ex);
        
        }
        
        @SuppressWarnings("LocalVariableHidesMemberVariable")
        File fragen = new File(DIR + "\\Fragen");
        @SuppressWarnings("LocalVariableHidesMemberVariable")
        File antworten = new File(DIR + "\\Antworten");
        
        if (!fragen.exists()) {
            fragen.createNewFile();
        }
        
        if (!antworten.exists()) {
            antworten.createNewFile();
        }
        
    }
    
    private static void fragenSpeichern(String frage, String antwort) throws IOException{
        
        try {
            
            newFragen.load(new FileInputStream(new File(inst.getProperty("Fragen"))));
            newAntworten.load(new FileInputStream(new File(inst.getProperty("Antworten"))));
            
        } catch (FileNotFoundException ex) {

            Logger.getLogger(Controller_01.class.getName()).log(Level.SEVERE, null, ex);
        
        } catch (IOException ex) {
            
            Logger.getLogger(Controller_01.class.getName()).log(Level.SEVERE, null, ex);
            
        }
        
        int letzteFrage = newFragen.size();
        int letzteAntwort = newAntworten.size();
        
        newFragen.setProperty(String.valueOf(letzteFrage++), frage);
        newAntworten.setProperty(String.valueOf(letzteAntwort++), antwort);
        
        try {
            
            newFragen.store(new FileOutputStream(new File(inst.getProperty("Fragen"))), null);
            newAntworten.store(new FileOutputStream(new File(inst.getProperty("Antworten"))), null);
            
        } catch (FileNotFoundException ex) {
            
            Logger.getLogger(Controller_01.class.getName()).log(Level.SEVERE, null, ex);
            
        }
        
    }
    
    private static void fragenHolen(){
        
        System.err.println("Fragen aus propFile holen und in HashMap temporär speichern");
        
        String fragenDatei = inst.getProperty("Fragen");
        String antwortenDatei = inst.getProperty("Antworten");
        
        try {
            
            newFragen.load(new FileInputStream(new File(fragenDatei)));
            newAntworten.load(new FileInputStream(new File(antwortenDatei)));
            
        } catch (IOException ex) {
            
            Logger.getLogger(Controller_01.class.getName()).log(Level.SEVERE, null, ex);
            
        }
        
        int anzahlAnFragen = newFragen.size();
        int anzahlAnAntworten = newAntworten.size();
        
        for (int i = 0; i < anzahlAnFragen; i++) {
            
            System.out.println(newFragen.getProperty(String.valueOf(i)));
            fragen.put(String.valueOf(i), newFragen.getProperty(String.valueOf(i)));
            
        }
        
        for (int i = 0; i < anzahlAnAntworten; i++) {
            
            System.out.println(newAntworten.getProperty(String.valueOf(i)));
            antworten.put(String.valueOf(i), newAntworten.getProperty(String.valueOf(i)));
            
        }
        
    }
    
    private static void fragenStellen(){
        
        if (fragen.isEmpty()) {
            
            DialogFX fertig = new DialogFX(DialogFX.Type.INFO);
            fertig.setMessage("Deine Abfrage ist nun beendet");
            
            Main.goToHauptmenue();
            
        }
        
        int letzteFrage = fragen.size();
        System.out.println("Letzte Frage :\t"+letzteFrage);
        int id = (int) (Math.random()*letzteFrage);
        
        System.out.println("Random :\t"+id);
        
        fragenID = id;
        
        frageAnzeigen(String.valueOf(fragen.get(id)));
        
        System.out.println("Frage gestellt :\t"+String.valueOf(fragen.get(String.valueOf(id))));
        
        fragen.remove(id);
        
    }
    
    @FXML
    public static void frageAnzeigen(String frage){
        
        txt_Frage_anzeige.setText(frage);
        
    }
    
    @FXML
    public void abfrage(MouseEvent e) throws Exception{
  
         con.goToAbfrage();
         fragenHolen();
         fragenStellen();
        
    }
    
    @FXML
    public void eingabe(MouseEvent e){
        
        con.goToEingabe();
        
    }
    
    @FXML
    public void benutzer(MouseEvent e){
        
        
        
    }
    
    @FXML
    public void speichern(MouseEvent e){
        
        System.err.println("Speichern aufgerufen");
        
        String frage = txt_Frage.getText();
        String antwort = txt_Antwort.getText();
        
        System.out.println("Frage :\t" + frage + "\t\tAntwort :\t" + antwort);
        
        if ("".equals(frage) || "".equals(antwort)) {
            
            System.err.println("LEER");
            DialogFX dialog = new DialogFX(DialogFX.Type.ERROR);
            dialog.setMessage("Füllen Sie bitte alle Felder aus um zu speichern");
            dialog.showDialog();
            
        }
        
        else{
            
            try {
                
                fragenSpeichern(txt_Frage.getText(), txt_Antwort.getText());
                
            } catch (IOException ex) {
                
                Logger.getLogger(Controller_01.class.getName()).log(Level.SEVERE, null, ex);
                
            }
            
            txt_Frage.setText("");
            txt_Antwort.setText("");
        
        }
        
    }
    
    @FXML
    public void Hauptmenü(MouseEvent e){
        
        Main.goToHauptmenue();
        
    }
    
    @FXML
    public void pruefen(MouseEvent e){
   
        System.out.println("Frage :\t" + txt_Frage_anzeige.getText() + "\t\tAntwort :\t" + txt_Antwort_eingabe.getText());
        
        DialogFX dialogRichtig = new DialogFX();
        dialogRichtig.setType(DialogFX.Type.INFO);
        dialogRichtig.setMessage("Deine Antwort war richtig");
        
        DialogFX dialogFalsch = new DialogFX();
        dialogFalsch.setType(DialogFX.Type.INFO);
        dialogFalsch.setMessage("Deine Antwort war leider falsch");
        
        String antwort = txt_Antwort_eingabe.getText();
        
        String richtig = (String) antworten.get(String.valueOf(fragenID));
        
        if (antwort.equals(richtig)) {
            
            dialogRichtig.showDialog();
            antworten.remove(fragenID);
            txt_Antwort_eingabe.setText("");
            txt_Frage_anzeige.setText("");
            fragenStellen();
            
        }
        
        else {
            
            dialogFalsch.showDialog();
            
        }
        
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        
        
    }    
    
}
```

Falls ihr noch meine fxml-Dateien habe wollt - kein Problem

Gruß
programmierer12


----------



## knilch (25. Mai 2014)

Hi,
In deinen Klassen sehe ich nur in einem Ort eine setText(....) die für txt_Frage_anzeige in Frage kommt.

Das FXML- Element txt_Frage_anzeige definierst du als static im Controller_01.java. die restlichen TextArea Elemente jedoch nicht. 

Du hast da ein wenig ein durcheinander mit Klassen- und Objekt- Members & -Methoden. An deiner stelle würde ich alle statischem Members & Methoden durch objekte und Objekt Methoden erstetzten.



```
public static void frageAnzeigen(String frage){
   txt_Frage_anzeige.setText(frage); 
}
```

und die Methode init muss nicht sein. Du implementierst Initializable. Das Interface Initializable besitzt die Methode initialize(). Diese wird beim instanzieren des Controllers als erste gestartet (muss nicht aufgerufen werden). In dieser Methode kannst du alles was du in der init() Methode machst,  einfügen. Die init- Methode entfällt somit.

```
@Override
        public void initialize(URL url, ResourceBundle rb) {
            // hier der code der in init() aufgerufen wird.... 
        }
```

Poste doch auch mal alle Dateien, damit das Projekt erstellt weren kann.
Gruss knilch


----------



## programmierer12 (25. Mai 2014)

Wie meinst du das jetzt genau? Stehe gerade total auf dem Schlauch!


----------



## knilch (25. Mai 2014)

Hi,
Ich hab mein letzes posting noch updated.

Was ist denn nicht klar?

Schick mir doch mal den ganzen Projektordner als zip file.
gruss knilch


----------



## programmierer12 (25. Mai 2014)

Download
Hier kannst du das Projekt als zip downloaden. Es ist allerdings ein NetBeans-Projekt

MFG
programmierer12


----------



## knilch (25. Mai 2014)

Hi,
Danke für den Code. Ich schau ihn mal an. Was mir aber schon mal aufgefallen ist, die Methode:

```
@FXML
public void frageAnzeigen(String frage){
   txt_Frage_anzeige.setText(frage); 
    }
```
Mit @FXML werden Methoden und Variablen definiert, welche in einer *.fxml- Datei benutzt werden. Aber bei den *.fxml- Dateien in deinem Projekt ist diese Methode nirgends vorhanden.
nimm mal das @FXML von dieser Methode weg und versuch es mal so...
Gruss knilch


----------



## knilch (25. Mai 2014)

Hi,
Ich hab nun ein paar änderungen erstellt und das Projekt läuft nun (aber mit Eclipse) Du musst nur die Java- Klassen und die *.fxml übernehmen.

ps. Methoden und Varibeln sollten NIE mit Umlauten benannt werden (wie bei dir: Hauptmenü). Wenn ein Umlaut benötigt wird, dann nur so: ö --> oe; ü --> ue etc. Weiter gilt allgemein für Methoden: CamelCase- Schreibweise (Namenskonvention (Datenverarbeitung) ? Wikipedia)

Download Karteikasten update.zip

gruss knilch


----------



## programmierer12 (25. Mai 2014)

Danke für deine Hilfe!
Ich habe jetzt den kompletten src Ordner ersetzt es hat sich aber nichts getan! Funktioniert trotzdem nicht.;(


----------



## knilch (25. Mai 2014)

Hi,
Der src ordner von Eclipse und NetBeans sollte gleich sein. Du musst eventuell noch die package defininition ändern....

Es waren mehrere Fehler:
Erst mal die Methode 

```
public void frageAnzeigen(String frage){
        txt_Frage_anzeige.setText(frage);
    }
```
darf die @FXML annotation nicht haben. Denn dies ist keine Methode die vom fxml aufgerufen wird, sondern von der fragenStellen().
Weiter war ein Problem mit dem updaten der Fragen & Antworten - Dateien in der Methode fragenSpeichern().Diese hat eine Exception geworfen, wenn eine neue Frage&Antwort gespeichert werden sollte.
Weiter war das Problem mit der Methode Hauptmenü --> durch umbenennen in Hauptmenu war das aber schnell gelöst.
Was du aber noch machen solltest, man kann mehrmals die selbe Frage mit der selben Antwort eingeben. Das darf so nicht sein. Die Kombination Frage & Antwort muss unique sein. Wenn nicht, dann kann es zu Problemen kommen...


----------



## programmierer12 (25. Mai 2014)

Das mit der Exception beim speichern könnte daran liegen, dass du im Roaming ordner keinen ordner Tutorio mit der config Datei und der Frage/Antwort datei hast. Bei mir funktioniert das Speichern wunderbar.


----------



## programmierer12 (25. Mai 2014)

Jetzt habe ich doch noch einen Fehler in der Klasse Controller steht in Eclipse in der ersten Zeile ein Fehlen:

```
Der Typ java.util.Map$Entry kann nicht aufgelöst werden. Erforderliche Dateien .class enthalten indirekte Verweise auf ihn.
```
Wenn ich das Projekt trotzdem ausführe bekomme ich folgende Exception geworfen:

```
Exception in Application start method
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367)
	at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:894)
	at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
	at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.Error: Unaufgelöstes Kompilierungsproblem: 
	Der Typ java.util.Map$Entry kann nicht aufgelöst werden. Erforderliche Dateien .class enthalten indirekte Verweise auf ihn.

	at karteikasten.Controller_01.<init>(Controller_01.java:1)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
	at java.lang.Class.newInstance(Class.java:433)
	at sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:51)
	at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:932)
	at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:976)
	at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:216)
	at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:738)
	at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2723)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
	at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2425)
	at karteikasten.Main.generateSceneContent(Main.java:90)
	at karteikasten.Main.main(Main.java:50)
	at karteikasten.Main.start(Main.java:117)
	at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837)
	at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
	at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
	at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
	at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
	... 1 more
Exception running application karteikasten.Main
```

Was kann ich tun um das Problem zu lösen?

MFG
programmierer12


----------



## programmierer12 (26. Mai 2014)

Kann mir denn keiner mehr helfen?


----------

