Swing ArrayList in Jlist/ List oder Array in JList/List

D-AMP

Mitglied
Liebes Java-Forum,
ich hätte da mal ein Problem:
Ich habe eine GUI mit einer Liste/ JList und eine Datenbank in der Benutzernamen gespeichert werden.
Ich möchte nun diese Benutzernamen in der JList (oder List je nachdem was einfacher ist) anzeigen.
Die Benutzernamen kann ich entweder in einer ArrayList oder in einen Normalen string Array speichern.
Hier mal der Codeschnippsel mit der ArrayList:
Java:
private  static ArrayList<String> benutzerliste = new ArrayList<String>();
try {
			String url = "jdbc:mysql://141.39.193.170/chat";
			String username = "chat";
			String password = "945033H";
			spalten = rs.getMetaData().getColumnCount(); 
			Connection con = DriverManager.getConnection(url, username, password);
			stmt = con.createStatement();
			rs = stmt.executeQuery("SELECT Benutzername FROM benutzerdaten");
			
			while (rs.next()) {
				
				for(int i = 1; i<=spalten; i++){
					benutzerliste.add(rs.getString("Benutzername"));
	
				}
				
				
			}
			
		}
Oder hier der Codeschnippsel mit dem Array:
Java:
private static String[] benutzerliste= new String[spalten];
String url = "jdbc:mysql://141.39.193.170/chat";
			String username = "chat";
			String password = "945033H";
			spalten = rs.getMetaData().getColumnCount(); 
			Connection con = DriverManager.getConnection(url, username, password);
			stmt = con.createStatement();
			rs = stmt.executeQuery("SELECT Benutzername FROM benutzerdaten");
while (rs.next()) {

				String user[] = new String[spalten];


				for(int i = 1; i<=spalten; i++){

					user[i] = rs.getString("Benutzername");


	

				}
Dass ganze soll dann über getter in die GUI Klasse übergeben werden, in der die JList/ bzw. List ist.
Java:
private List getList_1() {
		if (list == null) {
			list = new List();
			//list(DB_Manager.getBenutzerliste().toArray());
                        //list.add(DB_Manager.getBenutzerliste().toString());

			
		}
		return list;
	}
Hat irgendjemand ne Idee wie ich jetzt die ArrayList bzw. das Array in die Liste bzw. JList bekomm??? (In den Kommentaren seht ihr was ich schon ein bisschen ausprobiert hab)...
 
1. Verwende auf jeden Fall eine JList. Die gehört zum Swing-Framework. Mit java.awt.List wirst du wohl nicht wirklich arbeiten wollen.
2. JList hat einen Konstruktor, der ein Array entgegennimmt. Und ein Array hast du ja schon.
3. Dir ist schon klar, das java.awt.List und java.util.List NIX miteinander zu tun haben?
4. private static Variablen zeigen meist, daß mit dem Design des Programmes was nicht stimmt.
 
for(int i=0;i<arrayList.size()/array.length;i++)
_ jList.getModel().addElement(arrayList.get(i)/array) ?
 
Zuletzt bearbeitet:
So erstmal danke für eure Antworten!
Java:
for(int i=0;i<arrayList.size()/array.length;i++)
_ jList.getModel().addElement(arrayList.get(i)/array[i])
Funktioniert leider nicht...🙁
1. Verwende auf jeden Fall eine JList. Die gehört zum Swing-Framework. Mit java.awt.List wirst du wohl nicht wirklich arbeiten wollen.
Hatte auch vor eine JList zu verwenden, doch nachdem ich mit diesem ListModel überhaupt nicht zurechtgekommen bin dacht ich mir es wäre vielleicht einfacher eine awt.List zu verwenden da man der ja einfach Strings geben kann. War wohl ein dummer Gedanke, jetzt wird aufjedenfall eine JList verwendet.
3. Dir ist schon klar, das java.awt.List und java.util.List NIX miteinander zu tun haben?
Ist mir bewusst, fand die ArrayList nur 'ne elegante Methode mir die Daten aus der DB zu holen. Doch wenn die JList einen Konstruktor für Arrays hat, ist ein Array natürlich die bessere Methode.
So habs jetzt mal versucht, der Code in der GUI Klasse sieht jetzt so aus:
Java:
private JList getList() {
		if (list == null) {
			DB_Manager.benutzerliste();
			list = new JList(DB_Manager.getUser());
			//Den Array hol ich mir über einen von Eclipse automatisch erzeugten Getter
			
			}
		return list;
	}
Jetzt wird mir allerdings in meiner JList nur der letzte Benutzer der DB angezeigt und nicht alle 5??
Hier nochmal der Code zum DB auslesen:
Java:
rs = stmt.executeQuery("SELECT Benutzername FROM benutzerdaten");
			 user = new String[zeilen]; //Zeilen = 5 Anzahl der Benutzer welche in der DB gespeichert sind
			 while (rs.next()) {
				for(int z =0; z<zeilen;z++) {	
				 user[z] = rs.getString("Benutzername");
				 System.out.println(user[z]); //Es werden alle 5 Benutzernamen richtig ausgegeben 
				 break; 
				}
			}
 
Zuletzt bearbeitet von einem Moderator:
lemaos Vorschlag funktioniert deswegen nicht, weil JList.getModel() den Rückgabetyp ListModel hat, und dieses hat keine Methode addElement(). DefaultListModel hat eine.

Java:
while (rs.next()) {
    for(int z =0; z<zeilen;z++) {	
        user[z] = rs.getString("Benutzername");
        System.out.println(user[z]); //Es werden alle 5 Benutzernamen richtig ausgegeben
        break;
    }
}
Diese Schleife ist Käse.
Für jeden Eintrag im resultset schreibst du den Namen des aktuellen users an die erste Position des Array. In user[1] bis user[4] dürfte null drinstehen.
Änder das mal zu
Java:
int z=0;
while (rs.next()) {
        user[z++] = rs.getString("Benutzername");
        System.out.println(user[z]); //Es werden alle 5 Benutzernamen richtig ausgegeben
}
In vielen Fällen ist es übrigens praktisch, ein ListModel selbst zu erstellen, um listartige Daten in einer JList anzuzeigen, anstatt die Daten in ein Array zu packen und dieses zum erstellen einer JList zu verwenden. Dies ist besonders dann sinnvoll, wenn sich der Umfang der Daten ändert.
Hier ist mal ein Beispiel:

Java:
public class ListModelDemo {

    public static void main(String[] args) {

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ChildListModel clm = new ChildListModel(new Parent(new String[]{"Albert", "Birgit", "Christian", "Doris", "Emil"}));
        JList view = new JList(clm);
        f.getContentPane().add(new JScrollPane(view));
        f.pack();
        f.setVisible(true);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
        clm.setParent(new Parent(new String[]{"Frieda", "Georg", "Henriette", "Igor", "Jutta"}));

    }

    static class ChildListModel extends AbstractListModel {

        private Parent parent;

        ChildListModel(Parent p) {
            this.parent = p;
        }

        public int getSize() {
            return parent.getChildCount();
        }

        public Object getElementAt(int index) {
            return parent.getChild(index);
        }

        public void setParent(Parent np) {
            this.parent = np;
            fireContentsChanged(this, 0, getSize());
        }
    }

    static class Parent {

        String[] children;

        ;
        
        Parent(String[] children) {
            this.children = children;
        }

        public int getChildCount() {
            return children.length;
        }

        public String getChild(int index) {
            return children[index];
        }
    }

}
 
Zuletzt bearbeitet von einem Moderator:
Java:
int z=0;
while (rs.next()) {
user[z++] = rs.getString("Benutzername");
System.out.println(user[z]); //Es werden alle 5 Benutzernamen richtig ausgegeben
}
Fetten dank dafür 🙂, wär ich wohl nie draufgekommen...
Hab mir jetzt ein DefaultListModel erstellt und hab dann lemaos Vorschlag umgesetzt, funktioniert wunderbar.
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben