BufferedReader => TextField/Label

Milkaselnuss

Aktives Mitglied
Wie kann ich von einem Buffered Reader, der die Zeilen einer .txt Datei ausliest, die Zeilen in ein TextField bzw. ein Label setzen?
Java:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Kontaktbuch extends JFrame implements ActionListener {
   
    JButton suchen;
    JLabel label1;
    JTextField ausgabe;
    JTextField eingabe = new JTextField("");
   
    public Kontaktbuch(){
        super ("Kontaktbuch");
        JPanel panel = new JPanel();
        Box oben = Box.createHorizontalBox();
        Box mitte = Box.createHorizontalBox();
        Box unten = Box.createHorizontalBox();
        oben.setPreferredSize(new Dimension(400,20));
        mitte.setPreferredSize(new Dimension(400,30));
        unten.setPreferredSize(new Dimension(400,150));
        unten.setBorder(BorderFactory.createBevelBorder(1));
        label1 = new JLabel("Gesuchte Person: ");
        suchen = new JButton("Suche beginnen");
        suchen.addActionListener(this);
        ausgabe = new JTextField("");
        oben.add(label1);
        oben.add(eingabe);
        mitte.add(suchen);
        unten.add(ausgabe);
        panel.setLayout(new FlowLayout());
        panel.add(oben);
        panel.add(mitte);
        panel.add(unten);
        setContentPane(panel);
       
    }
    public void actionPerformed (ActionEvent Ereignis){
        Object Quelle = Ereignis.getSource();
        if (Quelle == suchen){
            try
            {
                String suche = eingabe.getText();
                final String verzeichnis = ("C:/Users/User/Documents/Kontaktbuch/" + suche + ".txt");
               
                BufferedReader bReader = new BufferedReader(new FileReader(verzeichnis));

                String sZeile = bReader.readLine();
                while (sZeile != null )
                {
                   
                    sZeile = bReader.readLine();
                   
                    System.out.println(sZeile);
                }        
                   
              
            }
            catch(IOException ioe)
            {
                ioe.printStackTrace();
            }
        }
    }


    public static void main(String[] args) {
        Kontaktbuch fenster = new Kontaktbuch();
        fenster.setSize(420,257);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setVisible(true);
        fenster.setLocationRelativeTo(null);


    }

}
 
Zuletzt bearbeitet von einem Moderator:
JTextfield und JLabel verfügen über die Methode "setText(String text)", mit der du den Text setzen kannst.
Daher:
[JAVA=66]ausgabe.setText(sZeile);[/code]

Nebenbei: Streams schließt man, wenn man sie nicht mehr benutzt.
[JAVA=69]bReader.close();[/code]
 
JTextfield und JLabel verfügen über die Methode "setText(String text)", mit der du den Text setzen kannst.
Daher:
[JAVA=66]ausgabe.setText(sZeile);[/code]

Nebenbei: Streams schließt man, wenn man sie nicht mehr benutzt.
[JAVA=69]bReader.close();[/code]

Danke für den Tipp mit den Streams. Und das mit dem setText hab ich schon ausprobiert und es hat nicht geklappt. Hätt ich vllt. dazu schreiben sollen :-/
 
Also, habe mir das ganze jetzt mal genauer angeschaut.

Zunächst einmal: setText() an sich funktioniert schon ;-)
Problem: Es hängt nichts dran, sondern ersetzt den vorherigen Inhalt. Der letzte Inhalt (letzte Zeile) ist nunmal null, daher bleibt das Textfeld scheinbar leer.

Wenn ich das richtig sehe, willst du den Inhalt der gesuchten Textdatei anzeigen (?).

Ein JTextfield, was du verwendest, ist nur für eine einzige Zeile gedacht. Ideal also für dein Sucheingabefeld, aber nicht geeignet für die Ausgabe. Du solltest es durch eine JTextarea ersetzen. Diese kann mehrere Zeilen anzeigen und bietet entsprechend die Methode "append(String text)", die an den bisherigen Inhalt noch etwas anhängt.

Korrektur zu meiner ersten Antwort:
ausgabe.setText(sZeile) bzw. jetzt ausgabe.append(sZeile) muss natürlich vor dem Lesevorgang in der Schleife stehen, da sonst die erste Zeile übergangen wird.

Edit:
Kleine Anmerkung noch: Variablen schreibt man klein ("Object [STRIKE]Q[/STRIKE]quelle" / "ActionEvent [STRIKE]E[/STRIKE]ereignis" ....). Gewöhn dir das richtig an ;-)
 
Zuletzt bearbeitet:
Eine Frage hätt ich dann noch, wie filtere ich das "null" am Schluss heraus? Eigentlich sollte das ja nichtmal da stehen (wegen dem while), aber irgendwas stimmt da nicht.
 
Verschieb die Zeile sZeile = bReader.readLine(); ganz an das Ende der Schleife. Klar kann (muss) hier am Ende null herauskommen. Die Prüfung findet ja erst zu Beginn des nächsten potentiellen Schleifendurchlaufs statt.

Nochwas:
Java:
if (Quelle == suchen)
funktioniert in diesem Fall zwar, ist aber dennoch nicht korrekt.
Der Operator == vergleicht bei nicht-primitiven Datentypen die Adressen der Objekte, nicht die Objekte selbst. Objekte vergleicht man grundsätzlich mit "equals": obj1.equals(obj2)

Simples Beispiel:
Java:
String a = new String("hallo");
String b = new String("hallo");
System.out.println(a==b); //false
System.out.println(a.equals(b)); //true
 
wichtiger Tipp: Probleme trennen,
mache eine Methode, die aus BufferedReader in einen String einliest, mit simplen System.out.println() ausgeben,
dann kannst du über Schleife, Zeilen, null usw. nachdenken ohne dich mit JLabel ärgern zu müssen,

danach eine weitere Methode bzw. ja nur eine Code-Zeile um den fertigen String in die GUI zu bekommen

Aufgaben trennen, strukturiert denken, das sind wichtige Eigenschaften jeder Arbeit
 
Ah ok.
Nur 1 Problem hab ich jetzt mit dem append
Gibt es da auch eine andere Methode mit der der vorherige Text nicht übenommen wird?
Denn sobald ich nach einem 2. Namen suche, reiht sich dieser am Schluss ein.

Selbst gelöst^^
Einfach setText und getText
 

Zurück
Oben