Swing Problem mit JList und MVC

  • Themenstarter Themenstarter booleanperhaps
  • Beginndatum Beginndatum
B

booleanperhaps

Gast
Hallo zusammen

mein Problem ist eigentlich recht simpel aber eine Antwort hab ich im Netz leider nicht gefunden. Ich habe eine Liste die ich gerne befüllen möchte durch einen Mausklick der ein Popupmenü öffnet, das einen anbietet einen neuen Eintrag zu erstellen. Ich hab das ganze so getrennt damit es dem MVC-Pattern gerecht wird, aber es funktioniert einfach nicht. Die Liste wird nicht geupdate aber der Debugger sagt mir das ein Element zum Model hinzugefügt wurde, was eigentlich heißen müsste das auch die Liste was davon mitbekommt, was sie aber nicht tut.

Hier mal die abgespeckte Version ohne Popupmenü etc. Das DefaultListModel hab ich nicht erweitert, da mir wichtig war das ich erstmal die grundlegende Funktion verstehe und zum laufen bringe.

View
[JAVA=42]public class JListTest extends JFrame{

private static JListTest instance = null;

private JList list = new JList();

private TestModel model = new TestModel();

public static JListTest getInstance() {
if(instance == null){
return instance = new JListTest();
}else{
return instance;
}
}
public ListModel getModel(){
return list.getModel();
}
public static void main(String[] args) {
new JListTest();
}

public JListTest() {
this.setContentPane(testpane());
this.pack();
this.setVisible(true);
}

public JList testpane(){
list.setModel(model);
list.addMouseListener(new TestMouseListener());
list.setLayoutOrientation(JList.VERTICAL_WRAP);
return list;
}
}[/code]

Model
[JAVA=42]public class TestModel extends DefaultListModel{

}[/code]

[JAVA=42]public class TestMouseListener extends MouseAdapter{

@Override
public void mouseClicked(MouseEvent mEvent) {

if ((mEvent.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {

} if ((mEvent.getModifiers() & InputEvent.BUTTON2_MASK) != 0) {

} if ((mEvent.getModifiers() & InputEvent.BUTTON3_MASK) != 0 && SwingUtilities.isRightMouseButton(mEvent)) {
JListTest jlt = JListTest.getInstance();
DefaultListModel dlm = (DefaultListModel)jlt.getModel();
dlm.addElement("String");

}
}
}[/code]

Mir ist klar das ich das DLM auch direkt in die View packen kann, wo dann das updaten auch funtkioniert, aber das ist eben nicht mein Ziel.


Würde mich freuen wenn mir jemand helfen könnte.
 
Hab ich bereits versucht per repaint() oder repaint(instance.getBounds()); geht beides nicht.

Aja und nimmt's nicht so genau mit public und private, ich hab die Methoden ausversehen beim testen als public deklariert. Nicht das jemand meint das ich mich erstmal über Sichtbarkeiten und Singelton informieren soll.
 
Hab ich bereits versucht per repaint() oder repaint(instance.getBounds()); geht beides nicht.

Aja und nimmt's nicht so genau mit public und private, ich hab die Methoden ausversehen beim testen als public deklariert. Nicht das jemand meint das ich mich erstmal über Sichtbarkeiten und Singelton informieren soll.

Hier mal ein Beispiel wies geht
Java:
public class JListTest extends JFrame{
 
    public static void main(String[] args) {
        new JListTest();
    }
    
    public JListTest() {
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	DefaultListModel defaultListModel = new DefaultListModel();
    	JList jList = new JList(defaultListModel);
    	jList.addMouseListener(new MyMouseListener());
    	add(new JScrollPane(jList));
    	this.pack();
        this.setVisible(true);
    }
    
    private class MyMouseListener extends MouseAdapter{
    	
    	@Override
    	public void mousePressed(MouseEvent e) {
        	JList jList = (JList)e.getSource();
        	DefaultListModel defaultListModel = (DefaultListModel) jList.getModel();
        	defaultListModel.addElement("Test");
    	}
    }
    
}


Versteh nicht warum du es so kompliziert machst.
1. Von einem Frame nicht den ContentPane überschreiben.
2. Eine Liste in eine ScrollPane packen
3. Für was das extra Model?
4. Du benötigtst keine singelton dafür.
 
Verstehe nicht was daran "kompliziert" sein soll

1. Warum nicht, was ist daran falsch?
2. Später wenn es läuft oder ist das zum updaten der Liste essenziell?
3. Für Funktionen die ich später einbauen will
4. Da bin ich mir nicht sicher ob ich einen brauche oder nicht. Wenn ich einen Eintrag selektiere soll mir später gewisse Daten aus einer Datenbank gebündelt angezeigt werden und anstatt jedes mal eine neue Instanz einer JList zu benutzen verwende ich die bereits existierende.

Ich will alles getrennt haben damit der Code übersichtlicher ist, auch wenn es auf den ersten Blick umständlich aussieht. Von Innerclasses halte ich recht wenig und die tragen in zu vielen fällen zu Missverständnissen des Codes bei. Actions sind komplett ausgelagert in eigene Klassen, Views bestehen nur aus den grafischen Komponenten die ich brauche, etc, etc

Um noch ein bisschen genauer zu sein: JList + rechter Mouseclick -> Popupmenu + selection von Menuitem zum anlegen -> anzeigen eines Textfeldes. Der Text wird vom Textfeld geholt und dadurch wird ein neuer Eintrag erstellt. Aus einem anderen Teil des Programms werden Daten selektiert die man dem Listen-Eintrag hinzufügen kann.
 
Schau dein Code an schau meinen an und du frägst was bei dir kompliziert ist???

1. Warum willst du den ContentPane überschreiben?
2. Sonst werden deine Objekte rausgeschnitten
3. Kann ich nichts dazu sagen aber bis jetzt sehe ich nicht warum du ein eigenes ListModel brauchst?
Was sollen den dort für Funktionionen rein, die nicht vorhanden sind? Das hört sich nach falscher Trennung an...
4. was??? Kein wort verstanden ^^... Wenn du ein richtiges ObserverPattern einbaust musst du doch nich jedes mal eine neue Liste anlegen? Model ändert sich Liste stellt sich neu dar.

Ich würde auch keine innere Klasse machen, das war exemplarisch...
Ich würde einen anonymen MouseAdapter als Controller implementieren und nicht ein extra Klasse machen.

Um noch ein bisschen genauer zu sein: JList + rechter Mouseclick -> Popupmenu + selection von Menuitem zum anlegen -> anzeigen eines Textfeldes. Der Text wird vom Textfeld geholt und dadurch wird ein neuer Eintrag erstellt. Aus einem anderen Teil des Programms werden Daten selektiert die man dem Listen-Eintrag hinzufügen kann.

dafür gibt set schon fertige methoden... nicht bei jedem user und os ist die rechte maustaste das kontextmenü, dass kann jeder user selber bestimmen manche haben es auch auf der mitteltaste!!!
Darum benutzt man
Code:
jList.setComponentPopupMenu(popup)

EDIT:
Vielleicht schadet es nicht den Link mal durch zu lesen
http://www.java-forum.org/awt-swing-swt/112503-mvc-projekt-umsetzen.html
 
Zuletzt bearbeitet von einem Moderator:
1. Kein spezieller Grund. Normalerweise hockt die Liste auf 'nem Panle welches den Frame überschreibt. Hab das so gelernt und auch bei den Beispielen von Sun/Oracle steht: frame.setContentPane(xyz);
2. Öh ... wenn ich das Fenster langziehe seh ich die Einträge die ich angelegt habe, zumindest wenn das DLM direkt in der View hängt
3. Zugriff auf Propertyfiles
4. Um auf das Model zuzugreifen geh ich über die Instanz meiner Liste, anders müsste ich mein Model neu initialisieren wenn es nicht direkt in der View hängt, oder nicht?

Danke für den Tipp bezüglich setComponentPopupMenu.
 
1. Kein spezieller Grund. Normalerweise hockt die Liste auf 'nem Panle welches den Frame überschreibt. Hab das so gelernt und auch bei den Beispielen von Sun/Oracle steht: frame.setContentPane(xyz);
2. Öh ... wenn ich das Fenster langziehe seh ich die Einträge die ich angelegt habe, zumindest wenn das DLM direkt in der View hängt
3. Zugriff auf Propertyfiles
4. Um auf das Model zuzugreifen geh ich über die Instanz meiner Liste, anders müsste ich mein Model neu initialisieren wenn es nicht direkt in der View hängt, oder nicht?

Danke für den Tipp bezüglich setComponentPopupMenu.

1. Mhm wo hast du das gesehen?
How to Use Lists (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
2. Ja wenn du es langziehst aber wenn man die Einträge nicht sieht ist doch schön wenn man scrollen kann ohne immer das ganze Fenster zu verschieben ist auch nur ein Vorschlag...
3. Sich dass du das in einem GUI Model machen willst?
4. he sorry kapier ich nicht?!? Link gelesen da ist doch ein Beispiel mit einer Liste und wie diese geupdatet wird.
 
Normalerweise hockt die Liste auf 'nem Panle welches den Frame überschreibt. Hab das so gelernt und auch bei den Beispielen von Sun/Oracle steht: frame.setContentPane(xyz);

Hab ich ja gesagt, was ist daran verkehrt? Leitet beides von JComponent ab
 
JFrame (Java Platform SE 6)

Swing's painting architecture requires an opaque JComponent in the containment hiearchy. This is typically provided by the content pane. If you replace the content pane it is recommended you replace it with an opaque JComponent.

Trifft beides auf die JList zu, prüf's doch mal mit isOpaque();
 

Zurück
Oben