JTextArea belegt ganzen JFrame

Was mach ich (Anfänger) falsch?
Ich mach den so ziemlich primitivsten Anfang in Java-Swing-Programmierung:
In einem JFrame soll ein Bereich als Logbuch reserviert sein.

Das funktioniert zwar soweit anfangs, aber bei der geringsten Änderung
(Fenster-Resize mit Maus am Rahmen, oder Änderung eines beliebigen Zeichens im Text,
oder xxx.add(„text“) im Progamm)

verursacht, dass das ganze JTextArea plötzlich den ganzen Bildschirm ausfüllt.

static void Oberflächevorbereiten()
 { logFeld=new JTextArea("Log:\nLog-Zeile\nLog-Zeile\n");
 logFeld.setBounds(5,300,780,60);

 Anzeige=new JFrame("Netzwerkgrafik");
 Anzeige.setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);
 Anzeige.setSize(800,400);
 Anzeige.setVisible(true); 
 Anzeige.add(logFeld);
 Anzeige.add(new JScrollPane(logFeld));
 // bis hier funktionierts aber **beim nächsten "repaint"**   
// **füllt 'logFeld' die ganze 'Anzeige' aus**.
// Anzeige.setVisible(true);
 }

Was hab ich nicht kapiert?

Hallo,

ehrlich oder höflich? Du machst überhaupt nichts richtig.

erst mal der Fehler, weshalb du gepostet hast: Du hast ein BorderLayout als Standard-Layoutmanager. Ein einfaches add fügt die Komponente ins CENTER hinzu (und verdrängt eine evtl dort bereits angezeigte Komponente). Dies tust du aber so spät, dass die Änderung vom System nicht erkannt wird, sondern erst beim nächsten resize().

Der Rest ist grausam:

Klassen tragen die Verantwortung für ihre Eigenschaften in sich. DIese werden also NIE von außen gesetzt.

Beispiel:

public class Anzeige extends JFrame {
 JTextArea logFeld = new JTextArea(40); // 40 Zeichen, das langt
 public Anzeige() { // Konstruktor hier wirds gemacht
 setDefaultCloseOperation(EXIT\_ON\_CLOSE); //beim Schließen programm verlassen
 Container cp = getContentPane(); // Swing schreibt hier
 cp.setLayout(new FlowLayout(FlowLayout.LEFT)); // linksbündiges Layout
 cp.add(logFeld);

 setSize(400,300); // Größe setzen oder Pack() benutzen
 setVisible(true); // diese beiden Zeilen IMMER an den Schluß
 }
 public static void main(String[] args) {
 new Anzeige();
 }
}

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

ehrlich oder höflich? Du machst überhaupt nichts richtig.

Lieber ehrlich :wink:
Vielen Danke für die klare Ansage.
den Rest werd ich mir mal auf der Zunge zergehenlassen.

(Man sieht, dass ich von C komme, und es nicht mal bis C++ ordentlich geschafft habe. Ich wäre nie auf die Idee gekommen, schon den Bildschirm als Objekt zu realisieren.)

Wenn ich noch ne Frage habe, dann meld ich mich wieder.
Vielen Dank!

Nochmals danke,

  1. hab ich jetzt einiges kapiert
  2. hab ich mir Tipparbeit erspart, weil dein Code sofort funktioniert.

Aber was mir noch nicht gelingt:
SetBounds bring ich einfach nicht auf die Reihe.
Ich möchte gerne das logFeld geziehlt versetzen können.

cp.setLayout(null);
cp.add(logFeld);
logFeld.setBounds(10,10,100,21);

Aber vermutlich willst du ja einen mehrzeiligen Text:

JTestArea ta = new JTextArea(); //TextArea erzeugen
JScrollPane sp = new JScrollPane(ta); //in ViewPort verpacken
cp.add(sp);
sp.setBounds(1,1,400,400);

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

cp.setLayout(null);
cp.add(logFeld);
logFeld.setBounds(10,10,100,21);

Ahaaa! Dann darf natürlich nicht CENTER verwendet werden.
Langsam versteh ich auch die Logiken.
Und dabei hab ich „die Insel“ wirklich durchgelesen!
aber die Beispiel sind dort nicht wirklich hilfreich, und erklärt wird eigentlich nichts so dass ich es verstehe.

Funktioniert prächtig:

JScrollPane sp = new JScrollPane(logFeld); //in ViewPort verpacken
cp.add(sp);

Vielleicht solltest DU ein Buch schreiben, oder kannst du eins empfehlen?
Weil mir die Begriffe Pane und Viewport und Component noch nicht wirklich verständlich sind.