# JList + ListModel



## MatheStein (23. Dez 2009)

Hey leute,

hab gerade ein kleines problem mit einer JList und zwar:

ich hab eine Klasse A in der eine JList und eine andere klasse B in der ein ListModel ist. 
der JList habe ich dem ListModel aus der klasse B übergeben. 
Wenn ich nun während der laufzeit des programms irgend etwas in das ListModel einfüge, dann müsste die Jlist das sofort anzeigen oder? bei mir tut sie das leider nicht.
weiß einer von euch woran das evtl liegen könnte?

gruß


----------



## diggaa1984 (23. Dez 2009)

zeig mal ein wenig code bezüglich dem verschweissen von liste und model


----------



## MatheStein (23. Dez 2009)

die anwendung ist leider etwas umfangreicher. grob:

[JAVA=42]
class A{
DefaultListModel ListModel = new DefaultListModel();

public DefaultListModel getListModel(){
     return this.ListeModel;
}

class B{
import A;

JList Liste = new JList();
Liste.setModel(A.getListModel());

}

[/code]

alle änderungen an ListModel in weiteren methoden der klasse A, zB das hinzufügen eines elements etc, sollen direkt in die JList Liste aus klasse B übernommen werden.

also mit anderen worten soll die JList eine visualisierung des ListModels sein, klappt aber leider nicht 

gruß


----------



## diggaa1984 (23. Dez 2009)

"alle änderungen an ListModel in weiteren methoden der klasse A" .. zeig mal bitte .. in der Regel überschreibt man dazu das DefaultListModel ... denn da wird dann durch fireXXXEvent die jeweilige Änderung an alle Listener (in dem Fall deine JList) propagiert


----------



## MatheStein (23. Dez 2009)

das ging ja schnell 

eigentlich ganze simple änderungen, zB:

[JAVA=42]
class A{
DefaultListModel ListModel = new DefaultListModel();

public DefaultListModel getListModel(){
     return this.ListeModel;
}

public addElem(String elem){
    ListModel.addElement(elem);
}

}

class B{
import A;

JList Liste = new JList();
Liste.setModel(A.getListModel());

}

[/code]
sowas in der art. würde ich jetzt addElem aufrufen, würde ListModel um einen Wert erweitert werden, der erscheint aber nicht in der JList der klasse B 

gruß


----------



## Spin (23. Dez 2009)

Hey ho , von was für ein Typ soll denn deine Methode 


```
public addElem(String elem){
    ListModel.addElement(elem);
}
```
 sein?


, void , primitiver Datentyp, oder Object.
?


Weiterhin schreibt man import immer über die Klasse. 

grüße


----------



## diggaa1984 (23. Dez 2009)

ich hoffe mal das der Code nur frei-hand getippt wurde, denn ListModel ist wie man erkennt bereits in Java vorhanden und kann nicht als Attributbezeichner verwendet werden ... Aber der TO würde ja gar nicht zur Aussage kommen, dass etwas zur Laufzeit nicht klappt, wenn er nicht mal durch den Compiler kommt .. von daher sage ich mal das Prinzip an sicht ist korrekt, bzw sehe ich nix an dem Bsp-Code ... im Zweifelsfall poste bitte mal ein KSKB an dem dein Problem sichtbar wird.


----------



## MatheStein (23. Dez 2009)

jo sorry war freihand eben runtergetippt  habt aber denke ich verstanden was ich meine 
falls es von bedeutung ist, "addElem" soll den rückgabewert "void" haben.


was ist ein KSKB?

ich poste einfach mal die klassen:

[JAVA=42]
public class Ereignisse {
    UmfragenMap Speicher = new UmfragenMap();
    DefaultListModel Liste = new DefaultListModel();

    public Ereignisse(){
        String[] Umfragen = Speicher.getAllTitel();
        for(int i=0;i<Umfragen.length;i++){
            Liste.addElement(Umfragen_);
        }
    }

    public DefaultListModel getListModel(){
        return this.Liste;
    }

    public UmfrageDT UmfrageGewaehlt(String Umfrage){
        return Speicher.getUmfrage(Umfrage);
    }

    public void NeueUmfrageB(){

    }

    public void AnlegenB(String Titel, String Umfragetext, String Enddatum){
        //System.out.println("Titel: "+Titel+"Umfragetext: "+Umfragetext+"Enddatum: "+Enddatum);
        UmfrageDT NeueUmfrage = new UmfrageDT(Titel,Umfragetext,Enddatum);
        Speicher.addUmfrage(NeueUmfrage);
        Liste.addElement(Titel);
        System.out.println("erreicht");
        System.out.println(Speicher.getAllTitel()[0]);
    }

    public UmfrageDT AbstimmenB(String Titel, boolean JN, String EmailAdresse, String Passwort){
       Speicher.getUmfrage(Titel).addUser(EmailAdresse, JN);
       return Speicher.getUmfrage(Titel);
    }
}
[/code]

und die klasse mit der JList:

[JAVA=42]
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * UmfragenListeFrame.java
 *
 * Created on 20.12.2009, 21:22:12
 */

package umfragesystem.GUI;
import umfragesystem.Geschaeftslogik.*;
import umfragesystem.Datentypen.*;
/**
 *
 * @author ari
 */
public class UmfragenListeFrame extends javax.swing.JFrame {
    Ereignisse ereignis = new Ereignisse();

    /** Creates new form UmfragenListeFrame */
    public UmfragenListeFrame() {
        super("Auswahl");
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        UmfrageListeL = new javax.swing.JList();
        NeueUmfrageB = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("Es gibt XXXX Umfragen in der Datenbank:");

        UmfrageListeL.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings; }
        });
        UmfrageListeL.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        UmfrageListeL.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                UmfrageListeLMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(UmfrageListeL);
        UmfrageListeL.setModel(ereignis.getListModel());

        NeueUmfrageB.setText("Neue Umfrage");
        NeueUmfrageB.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                NeueUmfrageBActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 355, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(NeueUmfrageB, javax.swing.GroupLayout.PREFERRED_SIZE, 193, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addContainerGap(32, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(18, 18, 18)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 182, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(NeueUmfrageB)
                .addContainerGap(24, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void NeueUmfrageBActionPerformed(java.awt.event.ActionEvent evt) {                                             
        // TODO add your handling code here:
        //ereignis.NeueUmfrageB();
        new NeueUmfrageFrame().setVisible(true);
        //Liste aktualisieren!
    }                                            

    private void UmfrageListeLMouseClicked(java.awt.event.MouseEvent evt) {
        // TODO add your handling code here:+
        if((!UmfrageListeL.isSelectionEmpty()) && evt.getClickCount()==2){
            String TitelSelElem=this.UmfrageListeL.getSelectedValue().toString();
            UmfrageDT selUmfrage=this.ereignis.UmfrageGewaehlt(TitelSelElem);
            new AbstimmenFrame(selUmfrage);
        }

        this.UmfrageListeL.updateUI();
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new UmfragenListeFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton NeueUmfrageB;
    private javax.swing.JList UmfrageListeL;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration

}
[/code]_


----------



## diggaa1984 (23. Dez 2009)

```
UmfrageListeL.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
```

der kann ja schonmal raus, da du das Model später wieder nochmal setzt .. ich bau mal was kleines was hoffentlich funktioniert, runtergebrochen auf deine Anforderungen


----------



## diggaa1984 (23. Dez 2009)

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ListModelTest extends JFrame {
	
	public ListModelTest() {
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		setLayout(new FlowLayout());
		JList list = new JList(ModelContainer.getModel());
		JButton addElem = new JButton("addElem");
		addElem.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				ModelContainer.addElem("foo");
			}
		});
		
		add(addElem);
		add(list);
		pack();
	}
	
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new ListModelTest().setVisible(true);
			}
		});
	}
	
	
	private static class ModelContainer {
		static DefaultListModel model = new DefaultListModel();
		
		public static DefaultListModel getModel() {
			return model;
		}
		
		public static void addElem(Object e) {
			model.addElement(e);
		}
	}
}
```

also das mal ganz rustikal ... mach das Fenster am Anfang ein wenig größer dann siehst auch die Liste .. und das klappt soweit :bahnhof:

das is übrigens ein KSKB .. ein "kleines selbstkompilierbares Beispiel" .. nur das hier dein Fehler nicht enthalten ist


----------



## MatheStein (23. Dez 2009)

die liste sehe ich ja nur die einträge in der liste nicht  hab mich sicher etwas unglücklich formuliert. kann das evtl mit der scrollpane zusammenhängen?

und der text der die item1... definiert ist von dem gui builder. der will sich irgendwie nicht löschen lassen


----------



## diggaa1984 (23. Dez 2009)

> die liste sehe ich ja nur die einträge in der liste nicht


das is mir bewusst, meine anmerkung galt ja auch meinem Bsp  ... gut an sich sollte dieser Item-teil aber nicht stören, da er ja kurz darauf wieder überschrieben wird, wär nur ein versuch


ok, nach nochmaligen drüberschauen, fällt mir auf das "AnlegenB" nie aufgerufen wird, oder überseh ich den Aufruf gerade?


----------



## MatheStein (23. Dez 2009)

der ist in noch einen anderen klasse 

ich hab mal in die klasse in der das ListModel ist im konstruktor mal was in das ListModel eingefügt, da klappt das wunderbar mit der JList. ich hab auch überprüft ob wirklich die AnlegenB aufgerufne wird (habe ne System.out.println("bla bla bal ") mit reingeschrieben das ist auch der fall. also in irgendwie will die JList wohl die dinger die in das ListModel kommen nicht einzeichnen


----------



## MatheStein (23. Dez 2009)

hab auch mal gerade während der laufzeit das listmodel ausgelesen und auf der konsole ausgegeben. da stehn definitiv elemente drin


----------



## diggaa1984 (23. Dez 2009)

ok dann die Frage was du explizit in die Liste jagst  nur Strings?

edit: aso .. hm das ja noch blöder ^^ @2. post

nutzt du eclipse oder dergleichen? dann lass dir mal sowas ausgeben wie:

```
meineEigensinnigeListe.getListModel().toString
```
 .. oder sowas .. notfalls die Elemente in einer Schleife einzeln ausgeben lassen


----------



## MatheStein (23. Dez 2009)

ich nutze netbeans.

genau so habe ich mir die element der liste ausgeben lass und sie kamen auch genau so raus wie erwartet. nur in der dummen jlist erscheinen keine einträge 

also in dem listmodel, dass der jlist übergeben wird stehen definitiv elemente drin.

und ja, ich übergebe nur strings, die beim auslesen der liste auch alle korrekt auf der konsole dargestellt werden


----------



## diggaa1984 (23. Dez 2009)

```
meineEigensinnigeListe.getListModel().toString
```
mit der liste da oben ist meine ich die JList .. deren Model hast du auch ausgegeben?!


----------



## MatheStein (23. Dez 2009)

hab ich gerade gemacht, das bleibt leer. zumindest gibt die .toString() nur [] aus.

woran kann ads denn liegen? das model die jlist mir zurückliefert sollte doch das model sein, dass ihm zugewiesen wird oder zumindest genau diese elemente enthalten oder?


----------



## diggaa1984 (23. Dez 2009)

hamwa schonmal n hinweis darauf, das ein anderes model an der liste hängt als du möchtest


----------



## MatheStein (23. Dez 2009)

jo danke 


also das model wird der JList direkt in dem konstruktor von der JFrame, in der die JList sich befindet, übergeben.


----------



## diggaa1984 (23. Dez 2009)

```
UmfrageListeL.setModel(new javax.swing.AbstractListModel() {
    String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
    
    public int getSize() { return strings.length; }

    public Object getElementAt(int i) { return strings[i]; }
});

<...>

UmfrageListeL.setModel(ereignis.getListModel());
```

es ist zwar nicht schön, aber eigentlich müsste danach dennoch das 2. Model, also eigentlich das richtige Model, vorliegen. Das hatte ich ja schon gesehen.


----------



## MatheStein (23. Dez 2009)

also mein code ist in etwas genau so wie deiner, nur das ich ihm den model erst später durch "setModel" übergebe und nicht im konstruktor


----------



## diggaa1984 (23. Dez 2009)

definiere später  .. oder zeig mal


----------



## MatheStein (23. Dez 2009)

ich habs schon geändert und auch so übergeben wie du, also direkt beim erstellen der JList. tuts immer noch nicht


----------



## diggaa1984 (23. Dez 2009)

hast viel Code? oder kann ich den mal bekommen? .. dann schau ich ma bei mir im Eclipse


----------



## MatheStein (23. Dez 2009)

wenn du willst gib mir deine email adresse, dann gibts das ganze projekt


----------



## diggaa1984 (23. Dez 2009)

hm aber nich hier, willst dich nich registriern


----------

