JavaFX zeigt keine Daten an

Grapholion

Lt. Junior Grade
Registriert
Mai 2006
Beiträge
317
Hallo Freunde,

ich weiss leider nicht mehr weiter und wende mich an euch. Ich schreibe zurzeit ein kleines Programm welches eine .xlsx Datenbank einliest, Daten hinein schreibt und aus Daten einen QR-Code generiert und diesen auch Drucken lässt. Alles funktioniert soweit gut. Doch wenn ich Daten auf der GUI anzeigen will, dann werden die Daten nicht gezeigt und die TextArea z.B. bleibt weiß.

Versucht habe ich des schon mit Textfield, Textarea, ListView usw.

Code:
    @FXML
    TextArea textDB; // Auflistung aller Seriennummern

Ich benutze den Gluon Scene Builder und habe schon ein Programm erfolgreich damit schreiben können.

Code:
	public void dbInhalt(){	
		textDB = new TextArea();
		String neu = null; //Test String
		int t = 0; //Zähler der Inhalte
		int z = 21; //Platz im Array der Seriennummern
		while(inhaltListe.hasNext()) {
			neu = (inhaltListe.next());
			t++;
			} 
		t/=15;
		for(int u=1; u <= t-1; u++){
			textDB.setText(inhalt[z]+"\n");
			z+=15;       
		}		
	};

Mit dieser Funktion filtere ich aus den Zellen die Seriennummern meiner Datenbank aus und will sie eigentlich untereinander auf der TextArea anzeigen lassen.

Wenn ich mit System.out.print die Daten ausgeben lasse und eine Abrage ob ein StringArray leer ist durchlaufen lasse ist alles in Ordnung. Falls ich Strings manuel eintippe wird es auch verabreitet, jedoch nicht einen aus dem Programm genommenen String auf der GUI angezeigt.

Am Controller kann es ja nicht liegen, da es verarbeitet wird. Hab leider keine Erklärung wieso es nicht angezeigt wird.

Bitte um Hilfe :)
 
Also ich weiß nicht warum deine TextArea weiß bleibt, mir fällt aber auf das du in der zweiten Schleife immer setText() verwendest.
Hier solltest du appendText() verwenden, sonst wird der alte Text immer überschrieben.
 
Habe ich auch schonmal versucht. Jedoch tut sich nichts. Der selbe Effekt und falls ich eine Systemausgabe erzeuge, werden die Daten normal in der Konsole ausgegeben aber in der GUI nicht. Es wird nicht einmal eine Fehlermeldung ausgegeben, ausser ich tippe einen Fehler oder setzte ein Int anstatt einen String usw.
 
Aus dem Quelltext den du hier bereitgestellt hast ist es nicht ersichtlich wo der Fehler steckt denke ich. Könntest du ein wenig mehr zur Verfügung stellen?
 
Natürlich. Die Datenbank wird in der Funktion eingelesen und kann auch in allen anderen Funktionen des Programms wiedergegeben werden. Das heißt die Strings sind wirklich vorhanden und nicht leer.

Code:
//Datenbank .xlsx einlesen
	public static void FST2Datenbank() throws IOException{
		FileInputStream dbInput = new FileInputStream(new File("C:\\Konverter\\db.xlsx"));
		XSSFWorkbook  dbArbeitsbereich = new XSSFWorkbook(dbInput);
		//Reihen und Spalten extrahieren
		XSSFSheet dbSeite = dbArbeitsbereich.getSheetAt(0);
		//einlesen der Reihe
		Iterator<Row> rowIterator = dbSeite.iterator();
        while (rowIterator.hasNext()) 
        {
            Row dbReihe = rowIterator.next();      
            Iterator<Cell> cellIterator = dbReihe.cellIterator();
            while (cellIterator.hasNext()) 
            {	i++;
                Cell dbZelle = cellIterator.next();
                switch (dbZelle.getCellType()) 
                {
                    case Cell.CELL_TYPE_NUMERIC:
                        break;
                    case Cell.CELL_TYPE_STRING:
                    	//Erzeugen der Inhalte
                    	inhalt[i]=(dbZelle.getStringCellValue());
                    	auswertung.add(inhalt[i]);
                        break;
                }
            } 
        }
        dbInput.close();
	};

Und initialisiert wird es in der Hauptfunktion.
Code:
public static void main(String[] args) throws IOException {
		FST2Datenbank();

Ich habe auch noch eine Funktion welche Daten in die Datenbank schreibt anhand eines TextField. Dies funktioniet und die Datenbank wird auch beschrieben.

Code:
public void dbschreiben() throws IOException{
		if (fst2 == true){
		String ende = null;
		int id;
		while(inhaltListe.hasNext()) {
			aktuell = (inhaltListe.next());
			} 
		for (int f=1; f <= 15; f++){
			ende = inhaltListe.previous();
		}
		id = Integer.parseInt(ende);
		id++;
		FileInputStream xlsxDatei = new FileInputStream(new File("C:\\Konverter\\db.xlsx"));
		BufferedInputStream xlsxBuff = new BufferedInputStream(xlsxDatei);
		XSSFWorkbook xlsxArbeit = new XSSFWorkbook(xlsxBuff);
		XSSFSheet xlsxSeite = xlsxArbeit.getSheetAt(0);
		CreationHelper xlsxFormat = xlsxArbeit.getCreationHelper();
        XSSFRow xlsxReihe = xlsxSeite.createRow(id);
        xlsxReihe.createCell(0).setCellValue(Integer.toString(id));
        xlsxReihe.createCell(1).setCellValue(inhalt[17]);
        xlsxReihe.createCell(2).setCellValue(inhalt[18]);
        xlsxReihe.createCell(3).setCellValue(inhalt[19]);
        xlsxReihe.createCell(4).setCellValue(inhalt[20]);
        xlsxReihe.createCell(5).setCellValue(eingabeFeld.getText());
        xlsxReihe.createCell(6).setCellValue(inhalt[22]);
        xlsxReihe.createCell(7).setCellValue(inhalt[23]);
        xlsxReihe.createCell(8).setCellValue(inhalt[24]);
        xlsxReihe.createCell(9).setCellValue(inhalt[25]);
        xlsxReihe.createCell(10).setCellValue(inhalt[26]);
        xlsxReihe.createCell(11).setCellValue(inhalt[27]);
        xlsxReihe.createCell(12).setCellValue(inhalt[28]);
        xlsxReihe.createCell(13).setCellValue(inhalt[29]);
        xlsxReihe.createCell(14).setCellValue(inhalt[30]);
		FileOutputStream xlsxNeu = new FileOutputStream("C:\\Konverter\\db.xlsx");
		xlsxArbeit.write(xlsxNeu);
		xlsxNeu.flush();
		xlsxNeu.close();
		}
 
Entferne mal bitte: textDB = new TextArea(); aus der Funktion dbInhalt().
Die TextArea wird bereits durch den FXML Loader initialisiert und du überschreibst diese damit.
 
So jetzt habe ich:

Code:
@FXML
    TextArea textDB; // Auflistung aller Seriennummern

Und

Code:
public void dbInhalt(){	
		String neu = null; //Test String
		int t = 0; //Zähler der Inhalte
		int z = 21; //Platz im Array der Seriennummern
		while(inhaltListe.hasNext()) {
			neu = (inhaltListe.next());
			t++;
			} 
		t/=15;
		for(int u=1; u <= t-1; u++){
			textDB.appendText(inhalt[z]+"\n");
			z+=15;       
		}		
	};

Immer noch das selbe :(

Aber mit einem appendText mache ich doch nichts falsch oder? TextArea wird nur in dieser Funktion verarbeitet und sonst niergends.
Ergänzung ()

Habe jetzt mal Eclipse neu gestartet. Und siehe da. Ein Fehler.

Code:
java.lang.NullPointerException
	at application.Main.dbInhalt(Main.java:103)
	at application.Main.start(Main.java:85)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(Unknown Source)
	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown Source)
	at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown Source)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Habe es wie oben Initialisiert ohne das new TextArea().

Zeile 103 ist

Code:
textDB.appendText(inhalt[z]+"\n");
 
Eigentlich nicht.

Und funktioniert es, wenn du einfach nur in dbInhalt(): textDB.setText("Test String"); setzt?

Edit: Dann funktioniert etwas mit deinem FXML nicht, denn eigentlich sollte textDB != null sein.
 
Zuletzt bearbeitet:
So habe eine Lösung gefunden. Danke dir Hooo hast mir aufjedenfall geholfen. Meine Lösung war die Datenbank nicht am Anfang in einer Funktion zu intitialisieren sondern mit einem Button. Durch den Button hat das TextArea einen zugriff auf den Controller bekommen und hat die Datenbank eingelesen. Ohne irgendeine Action geht das setzen anscheinend nicht. FXML hat gestimmt und das initialisieren auch :) jetz bin ich Happy
 
Zurück
Oben