# eigene Konsole



## PrincE (12. Mrz 2010)

Hallo ich hab gerade ein für mich unlogisches Problem:

Ich habe eine Main Klasse die mittels 
Konsole oKonsole = new Konsole();
eine Neue Instanze der Klasse Konsole erstellen soll.

Das TextArea das in der Konsole Klasse benutzt wird ist in der Main Klasse definiert:
public static JTextArea area = new JTextArea();

Es soll beliebig oft eine Konsole neu erstellt werden.
Das funktioniert auch soweit 

doch wenn ich jetzt in eine Konsole rein schreibe bekomm ich die aktualisierung immer nur in der "neuesten Instanze der Konsole" obwohl sich alle Instanzen von Konsole sich immer auf das TextArea in der Main Klasse beziehen.

Bsp:

- Ich öffne Konsole1 
- schreibe rein
- und bekomm die Ausgabe auch dort

- Ich öffne Konsole 2
- schreibe rein
- und bekomm die Ausgabe auch dort!

- jetzt schreibe ich nochmal in Konsole1
- und bekomm nur die Ausgabe in der Instanze der Konsole 2
- also nicht in der eigenen wo ich rein geschrieben habe


Wieso ist das so?



//

Ah verdammt ich habe den Thread ins falsche unterforum erstellt

bitte nach Plattform programmieren verschieben


----------



## SlaterB (12. Mrz 2010)

static ist immer schlecht bei GUIs, jede Komponente kann nur einmal eingefügt werden,
geht sie in die zweite Konsole verschwindet sie aus der ersten,

wenn dann kannst du das dahinterstehende Document zentral als ein Objekt vorhalten, wobei auch das besser nicht statisch,
die JTextArea alle einzeln mit gemeinsamen Document als Model


----------



## PrincE (12. Mrz 2010)

ich hab das jetzt so akzeptiert das das so nicht geht.

Aber deine lösung verstehe ich nicht:

wenn ich das textarea nicht static mache kann ich es ja von der Konsolen Klasse her nicht ansprechen.
Könntest du mir das vielleicht ein bisschen ausführlicher erklären


----------



## fastjack (12. Mrz 2010)

Jede Konsole müßte ihre eigene TextArea haben, dann klappts.


----------



## SlaterB (12. Mrz 2010)

Alternative zu static wäre, Objekte im Konstruktur als Parameter zu übergeben,
aber meinetwegen bleibe vorerst bei static,

eine JTextArea kann dies dennoch wie gesagt nicht sein, eine GUI-Komponente kann nicht mehrfach verwendet werden,
belassen wir es in diesem Punkt bei deinem 'akzeptiert das das so nicht geht', viel mehr könnte ich das spontan auch nicht erklären

jede Konsole braucht ihre eigene JTextArea als View, als 'Anzeige-Maschine', die Daten aber, der wenige gemeinsame Text,
der kann dagegen in einem zentralen einzelnem Objekt stehen, einen Document,

kein ganz einfaches Thema, ob ein Document-Objekt + setDocument() in jeder JTextArea reicht?
schaue jedenfalls bitte dazu erstmal selber weiter, suche bei google, was ein Document überhaupt ist falls noch unbekannt usw.


----------



## PrincE (12. Mrz 2010)

ok ich hab jetzt ein wenig anders versucht
wie vorher auch gibt es in der Main Klasse eine globale textarea 
doch jetzt hat jede konsole auch noch seine eigene textarea 
ich schreibe immer in die globale und nehme den text von der globalen und schreib es in die lokale rein

und das funktioniert alles bis auf das wenn ich konsole1 schreibe nur der Text in konsole1 ankommt und nicht in den anderen geöffneten konsolen

und das auch nicht wenn die konsole2 z.B. etwas schreibt "um sich im Prinzip den neuen Stand zu holen"
aber so wie ich das jetzt von dir verstanden habe kommt es ja dann auf gleiche raus..


----------



## eRaaaa (12. Mrz 2010)

```
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;

public class KonsolenDemo {
    
    public KonsolenDemo(Document doc){
	JFrame frame = new JFrame();
	JPanel panel = new JPanel();
	JTextArea area = new JTextArea(5,20);
	area.setDocument(doc);
	panel.add(area);
	frame.add(panel);
	frame.pack();
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setLocationRelativeTo(null);
	frame.setVisible(true);
    }
    
    public static void main(String[] args) {
	Document doc = new PlainDocument();
	new KonsolenDemo(doc);
	new KonsolenDemo(doc);
    }
}
```


----------

