PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Problem mit validate()



Sym
19-11-2003, 03:12
Hi,

also, nennt mich dumm, aber ich versuche es nun echt schon Stunden. Im Internet habe ich mich auch totgesucht und anscheinend verstehe ich die Sache immer noch nicht.

Ich sitze an einem Programm, für welches ich gerade noch die GUI fertigstelle.

Folgendes: Ich habe mir ein BorderPanel gebastelt. Enthalten sind:

MainFrame -> BorderPanel -> JScrollPane -> JList.

So, die JList ist am Anfang null. Danach ändere ich sie mit

list.setListData(String[]);.
So, und jetzt habe ich alles versucht, dem Programm klarzumachen, dass dort was neues steht. Doch es passiert nichts.

Es klappt nur, wenn ich:

JScrollPane aushänge (remove)
JSP = new JScrollPane(list);
JScrollPane einhängen (add)

Weiß jemand Rat?

fs111
19-11-2003, 07:40
Was passiert, wenn Du repaint aufrufst?

fs111

anda_skoa
19-11-2003, 09:51
Am besten das ListModel explizit erzeugen, in der JList Instanz gelich am Anfang setzen und die Daten dort manipulieren.
Das ListModel benachrichtigt die JList dann von sich aus.

Ciao,
_

Sym
19-11-2003, 15:43
Ich verstehe es leider nicht. Mein Code sieht ungefähr folgendermaßen aus:
MemberVariablen;

private String[] test = new String[2];
private JList fileList = new JList(test);
private JScrollPane jspFileList = new JScrollPane(fileList);
private BorderPanel bpFileList = new BorderPanel("Datei-Liste");
Panels einhängen:

this.getContentPane().add(this.bpFileList);
this.bpFileList.setLayout(new FlowLayout());
this.bpFileList.add(this.jspFileList);
this.jspFileList.add(this.fileList);
this.jspFileList.setPreferredSize(new Dimension(100,100));
this.jspFileList.setLayout(new FlowLayout());
Jetzt wird in meinem BorderPanel ein kleines Quadrat angezeigt. Ich denke mal, dass ist das JScrollPane.
Setze String:

test[1] = "bla";
test[2] = "blub";
fileList.validate();
validate();
Leider passiert da nichts. Eeerrgh - sehe ich den Fehler einfach nicht. Mittlerweile verliere ich bei den ganzen Tests den Überblick ;(

Sym
19-11-2003, 15:44
Original geschrieben von fs111
Was passiert, wenn Du repaint aufrufst?

fs111

geht leider auch nicht...

Shack
19-11-2003, 16:12
probier mal das :

my_list.revalidate();
my.list.repaint();

Sym
19-11-2003, 16:16
Original geschrieben von Shack
probier mal das :

my_list.revalidate();
my.list.repaint();

ich denke mal mit my.list meinst Du fileList? Das habe ich auch schon versucht.
Ich glaube, ich mache einen Systematischen Fehler...

anda_skoa
19-11-2003, 19:42
Original geschrieben von Sym
Ich verstehe es leider nicht.


Macht ja nix, das schaffen wir schon :)

Werfen wir mal zusammen einen Blick in die JList Doku.
Da haben wir einen Konstruktor


JList(ListModel dataModel)

Klicken wir auf ListModel.

Dort sehen wir, dass ein ListModel Listener haben kann, die es über Änderungen der Daten informiert. Hört sich schon mal gut an.

ListModel ist ein Interface, also suchen wir mal, ob es da nicht schon eine DefaultImplementation gibt.

Am Anfang der Doku gibt es einen Bereich "All Known Implementing Classes", wo ein Link zu AbstractListModel ist.
Ein Klick darauf zeigt uns, dass wir damit immer noch nichts machen können, aber jetzt gibts schon eine feine Liste von bekannten Subklassen.

Klicken wir mal "zufällig" auf DefaultListModel und, siehe da, jede Menge Methoden um die Daten zu manipulieren :D

Fassen wir zusammen


import javax.swing.DefaultListModel;
import javax.swing.JList;

//...
DefaultListModel model = new DefaultListModel();
JList list = new JList(model);


Wann immer du das Model änderst, wird es über den Listener Mechanismus dafür sorgen, dass die Liste das mitbekommt.

Ciao,
_

peschmae
19-11-2003, 19:49
War mir noch gar nicht bewusst, dass man unter Swing sozusagen ein DataModel verwenden muss. (Zumindest wenn man die Daten anschliessend noch ändern können möchte).

Ich wusste bisher nur, dass man das kann (und bei SWT eben nicht ;))

MfG Peschmä

Sym
19-11-2003, 20:16
Wunderbar,

das hat geklappt. Ich habe einen anderen Konstruktor von JList genutzt, was dann das Problem zur Folge hatte.

Normalerweise programmiere ich keine Oberflächen - ist halt alles neu mit Java ;).

Aber es wird... es wird. Dank an Euch.

anda_skoa
20-11-2003, 11:41
Original geschrieben von peschmae
War mir noch gar nicht bewusst, dass man unter Swing sozusagen ein DataModel verwenden muss. (Zumindest wenn man die Daten anschliessend noch ändern können möchte).


Swing hat ein sehr durchgängiges Model-View Design.
Trivale Sachen kannst du direkt mit dem View machen, aber wenn du bestimmte Eigenschaften der Daten bzw. ihrere Repräsentation beinflussen willst, kannst du das realiv leicht in dem du das Model austauschst.

Ciao,
_

peschmae
20-11-2003, 11:50
genau das fehlt mir in meinem letzten Programm :D

Das Design ist imho (eigenlob ;)) nicht so schlecht, aber eine (noch) striktere Model-View Trennung hätte enorm viel gebracht.

Naja, man lernt nie aus...

MfG Peschm