GUI JList - Objekte listen u. Feld anzeigen?

membersound

Bekanntes Mitglied
Hallo,

ich möchte einem DefaultListModel() eigene Objekte hinzufügen, und diese bei Auswahl weiter verarbeiten können.
Ich lasse die Liste als JList in meinem Fenster anzeigen.

Meine Frage ist: wie kann ich nur eine bestimmte Eigenschaft (also ein Memberfeld) der Objekte in der Liste anzeigen? UND dabei das Objekt selbst an Ort und stelle behalten?

Ich weiß nur, wie ich zb ein String-Feld des Objekts in der Liste darstellen kann. Folglich ist in der Liste aber dann auch nur ein String drin, und nicht mehr das Objekt.


Habe hier versucht exemplarisch (und unvollständig) alles mir wichtig erscheinende als Code darzustellen:
Java:
public class Auto {

	private int kilometer;
	private String farbe;

	//konstruktor, getter, setter
}

public class MyAutoModel {
	private ArrayList<Auto> autoListe = new ArrayList<>();

	public myAutoModel() {
		Auto astra = new Auto(30000, "rot");
		autoListe.add(astra);
	}

	//getter: getArrayList()...
}

public class MyAutoView {
	private MyAutoModel model;
	private DefaultListModel myList;

	public MyAutoView(MyAutoModel model) {
		this.model = model;
		initComponents();
	}

	private void initComponents() {

		myList = new DefaultListModel();
		//GUI...

		button.setText("open this object");
		button.addActionListener(new ActionListener() {
			public void buttonClickActionPerformed(ActionEvent evt) {
			openActionPerformed(evt);
		}
	}	


	private void buttonClickActionPerformed(ActionEvent evt) {

		for (int i = 0; i < model.getArrayList().size(); i++) {
			myList.addElement(model.getArrayList().get(i).getFarbe());
		}

	}


	
	//hier würde ich nun die Farbe ausgegeben bekommen
	System.out.println(myList.getElementAt(0));	
}

Eigentlich möchte ich mit getElementAt aber das Objekt selbst bzw die Objektreferenz erhalten, um mit diesem Objekt weiter zu arbeiten: ein neues Fenster erzeugen, und erst dort alle Membervariablen auslesen und darstellen.

Vl denk ich auch zu kompliziert und es ist eigentlich ganz einfach? :rtfm:

Danke
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
[c] myList.addElement(model.getFarbe());[/c]
mal davon abgesehen dass das model.getFarbe() generell falsch aussieht, musst du hier die Auto-Objekte hinzufügen. Bzw eig. hast du ja schon ein Model mit einer Liste, irgendwie ist das doppelt gemoppelt was du machst.

Aber zu deiner eigentlichen Frage:
Meine Frage ist: wie kann ich nur eine bestimmte Eigenschaft (also ein Memberfeld) der Objekte in der Liste anzeigen?

Indem du einfach die toString-Methode deiner Auto-Klasse überschreibst. Das würde dann zwar gehen, aber wohl nicht optimal. Ein eigener Renderer wäre dann noch eine Alternative!
 

membersound

Bekanntes Mitglied
[c] myList.addElement(model.getFarbe());[/c]
mal davon abgesehen dass das model.getFarbe() generell falsch aussieht

ja stimmt, ich habs editiert, ich glaub ich meinte "model.getArrayList().get(i).getFarbe()"

, musst du hier die Auto-Objekte hinzufügen. Bzw eig. hast du ja schon ein Model mit einer Liste, irgendwie ist das doppelt gemoppelt was du machst.

Ja, müsste ich, damit ich mit ihnen arbeiten kann. Aber angezeigt bekomme ich dann ja so Speicheradressen wie Auto@2341223 angezeigt. Und ich würde in diesem Beispiel ja die Farbe wollen.

Die toString Methode ist leider schon an anderer Stelle überschrieben, für einen FileWriter.

"Renderer" sagt mir jetzt grad gar nichts. Vielleicht verfolge ich mit der JList aber auch den falschen Ansatz und das geht anders viel besser?? Ich wüsste nur nicht wie...
 

eRaaaa

Top Contributor
Aber angezeigt bekomme ich dann ja so Speicheradressen wie Auto@2341223 angezeigt. Und ich würde in diesem Beispiel ja die Farbe wollen.

Die toString Methode ist leider schon an anderer Stelle überschrieben, für einen FileWriter.

Diese beiden Aussagen passen meiner Meinung nach nicht zueinander. Auto@2341223 sieht nach der Default-Implementierung, also die Implementierung der Oberklasse Object aus, d.h. du hast die toString in deiner Auto-Klasse NICHT überschrieben!

Renderer:
How to Use Lists (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
 

membersound

Bekanntes Mitglied
(toString hatte ich tatsächlich nicht mehr überschrieben).

Noch eine Frage: mit getListCellRendererComponent(...) scheinen mir ja sämtliche Formatierungen der JList verloren zu gehen. zB kann ich auch nicht mehr markieren, die Schriftart sieht anders aus, irgendwie kleiner und näher zusammen gerückt.
Kann ich nicht irgendwie den Style der JList beibehalten?
 
Zuletzt bearbeitet:

membersound

Bekanntes Mitglied
Java:
//ich adde nun die Auto-Elemente mit:
myList.addElement(model.getArrayList().get(i));

//die renderer klasse:
class MyRenderer extends JLabel implements ListCellRenderer {
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

	    //muss ich das hier casten?
            Auto tmp = (Auto) value;

            setText(tmp.getFarbe());

            return this;
        }
}

Ich hätte eigentlich erwartet, dass ich mit value.getFarbe() irgendwie weitermachen kann. Aber das scheint nicht zu gehen, also muss ich vorher das Auto Objekt casten. Ist das richtig?

Irgendwie ist das konfus in meinem Kopf: ich sammel meine Auto-Objekte in einer ArrayList, damit ich alle zusammen bequem an den View reichen und adden kann. Und dann muss ich das zu addende Objekt doch wieder im Viewer zurückcasten, um an die Membervariablen zu kommen. Irgendwie dreht man sich da doch im Kreis?...
 

eRaaaa

Top Contributor
Naja in deiner Liste liegne zwar die Auto-Instanzen, aber schau dir mal die Methode an:
Java:
  public Component getListCellRendererComponent(JList list, Object value, ....
[c]Object value[/c]
Der Typ ist also Object. Der Compiler weiss an dieser Stelle nicht dass du da Auto-Objekte rein packen willst/getan hast, also musst du erst einmal casten um dann die Methoden deiner Auto-Klasse benutzen zu können. Das hat jetzt aber nichts mit Kreis drehen zu tun oder sonst was, sondern eher mit dem Interface: ListCellRenderer (Java Platform SE 6)
 

Dit_

Bekanntes Mitglied
Meine Frage ist: wie kann ich nur eine bestimmte Eigenschaft (also ein Memberfeld) der Objekte in der Liste anzeigen? UND dabei das Objekt selbst an Ort und stelle behalten?
Ich glaube das geht ganz einfach.

Ich würde das Modell default lassen und toString() Methode deines Objekts entprechend überschreiben. JList enthält dann die Objekte zeigt aber das was du in toString() definiert hast.
 

SamHotte

Top Contributor
Ich glaube das geht ganz einfach.

Ich würde das Modell default lassen und toString() Methode deines Objekts entprechend überschreiben. JList enthält dann die Objekte zeigt aber das was du in toString() definiert hast.

Dem kann ich nur zustimmen. Zumal Du auf die Weise schon die ganzen Autos hast, wenn Du damit weiterarbeiten möchtest (bspw. die Details anzeigen, wenn eins selektiert ist).
 

membersound

Bekanntes Mitglied
Ich habe es jetzt auch nochmal mit der toString() überschreiben Methode versucht, geht auch wunderbar.

Aber da ich den Listenstyle auch noch ändern will (zB ein Icon vor die Objekte setzen), werd ich das wohl mit dem Renderer machen müssen.
Oder gibt es noch abseits des Renderers eine Möglichkeit die JList appearance zu steuern?

Danke
 

membersound

Bekanntes Mitglied
Ja genau. OK dann lass ich es so mit dem Renderer.

Mir ist gerade aber noch etwas aufgefallen, was ich nicht einordnen kann:
Die JList, die ich mit dem Renderer darstelle, sieht anders aus als wenn ich ihn nicht benutze. Auch wenn ich bloß folgendes schreibe:

Java:
class MyRenderer extends JLabel implements ListCellRenderer {
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            return this;
        }
}

Wie kann das sein?
Ich habe auch mal mit und ohne Renderer die getFont() ausgegeben. Ist exakt gleich. ABER wird anders dargestellt! Wie kommt das denn?
 

membersound

Bekanntes Mitglied
Kann ich irgendwie alle Style-Eigenschaften von DefaultListCellRenderer da implementieren?

Die renderer Liste sieht schon echt anders aus. Schrift ist kleiner und Buchstaben stehen enger, zwischen den Elementen ist weniger Space, der Hintergrund der Einträge wird nicht mehr farbig markiert beim selecten, usw.

/notfalls style ich halt selbst mit new EmptyBorder() und setBackground()...
 
Zuletzt bearbeitet:

SamHotte

Top Contributor
Ja, kanst Du. Aber Du müsstest Deine Architektur leicht verändern, indem Du Deinen Renderer nicht von JLabel erben lässt, sondern von DefaultListCellRenderer. Dieser kann dann der JList zugewiesen werden über setCellRenderer().
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JList Objekte richtig anzeigen in JDK 6 Java Basics - Anfänger-Themen 5
Mady Daten von JList & Combobox in JTable adden Java Basics - Anfänger-Themen 2
U JList erstellen Java Basics - Anfänger-Themen 2
Soloeco JList/DefaultListModel: Wie kann ich ein Panel hinzufügen? Java Basics - Anfänger-Themen 1
J Objekt bei Auswahl in jList ändern Java Basics - Anfänger-Themen 6
D JList ListSelectionEvent entfernen? Java Basics - Anfänger-Themen 13
F JList Elemente mit Strings vergleichen Java Basics - Anfänger-Themen 12
S Export aus JList Java Basics - Anfänger-Themen 6
M Erste Schritte JList einträge Java Basics - Anfänger-Themen 1
M Erste Schritte Doppelte Ausgabe? (JList) Java Basics - Anfänger-Themen 1
M Erste Schritte Auswahl in einer JList Java Basics - Anfänger-Themen 2
P JList, aus selectedValue bestimmten Wert aus Containerklasse auslesen Java Basics - Anfänger-Themen 4
N JList + DefaultListModel + JScrollPane --> ensureIndexIsVisible funktioniert nicht immer Java Basics - Anfänger-Themen 1
C JList Einträge nach Datum sortieren Java Basics - Anfänger-Themen 3
J Element zu jList hinzufügen NullPointerExcepetion Java Basics - Anfänger-Themen 2
S jList --> Array einfügen und Liste löschen Java Basics - Anfänger-Themen 5
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
I in listFiles() oder JList Dateiendungen entfernen Java Basics - Anfänger-Themen 14
N Erste Schritte MySQL Tabelle in JList darstellen Java Basics - Anfänger-Themen 1
O JList aktualisieren während Dateieinlesung Java Basics - Anfänger-Themen 4
B JFileChooser und JList Java Basics - Anfänger-Themen 7
OnDemand Enumeration <> JList Java Basics - Anfänger-Themen 5
P Mehrfachauswahl in einer JList Java Basics - Anfänger-Themen 2
A JList Elemente in ein andres JList Adden Java Basics - Anfänger-Themen 5
C .txt und Jlist Java Basics - Anfänger-Themen 10
J Daten in eine JList einfügen Java Basics - Anfänger-Themen 6
A JList / toString modify Java Basics - Anfänger-Themen 2
K jlist an text anpassen Java Basics - Anfänger-Themen 3
D Erste Schritte JList + Checkbox Java Basics - Anfänger-Themen 5
I kein zugriff auf jList oder Textfield Java Basics - Anfänger-Themen 2
A JList bearbeiten Java Basics - Anfänger-Themen 2
M Index einer JList ausgeben Java Basics - Anfänger-Themen 4
M Inhalt/Wert aus einer JList ablesen Java Basics - Anfänger-Themen 5
J Markierte Einträge (Dateien) in JList sollen in einen anderen Ordner verschoben werden. Java Basics - Anfänger-Themen 12
J Markierte Items in einer JLIST in einen Ordner verschieben Java Basics - Anfänger-Themen 2
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
S ListModel - Anzeige im JList Java Basics - Anfänger-Themen 4
H JList Java Basics - Anfänger-Themen 2
U JList Java Basics - Anfänger-Themen 6
L HashMap zu JList Java Basics - Anfänger-Themen 6
C Input/Output Inhalte von ArrayList und JList in Datei schreiben Java Basics - Anfänger-Themen 5
M Jlist Elemente hinzufügen Java Basics - Anfänger-Themen 2
F Koordinaten JList darstellen Java Basics - Anfänger-Themen 4
M BeanBinding Jlist an Jlabel Java Basics - Anfänger-Themen 2
E JList GUI aktualisieren? Java Basics - Anfänger-Themen 3
JAVAnnik JList Auswahl Java Basics - Anfänger-Themen 2
Z In JList per Doppelklick eine Datei öffnen (z.B. ein PDF) Java Basics - Anfänger-Themen 16
P Jlist + Popupmenu Java Basics - Anfänger-Themen 10
M Properties Eintrag löschen, welcher in der JList "ausgewählt" wurde Java Basics - Anfänger-Themen 2
c_sidi90 File Array an Jlist übergeben Java Basics - Anfänger-Themen 11
J JList Inhalt nach JButton Klick aktualisieren Java Basics - Anfänger-Themen 8
B JList und JTable: leere Zeilen bei listfiles(); Java Basics - Anfänger-Themen 5
N DefaultListModel auf JList sortieren Java Basics - Anfänger-Themen 7
A JList mit Überschrift Java Basics - Anfänger-Themen 2
K Scrollbalken in JList funktioniert nicht Java Basics - Anfänger-Themen 9
B JList wird nicht aktualisiert bzw hat keine Items Java Basics - Anfänger-Themen 2
D JList nicht sichtbar Java Basics - Anfänger-Themen 4
B JList mit Scrollbar? Java Basics - Anfänger-Themen 7
K Datenbindung an JTable, JList, Primärschlüssel verstecken Java Basics - Anfänger-Themen 4
M JList Event Java Basics - Anfänger-Themen 5
M JList Index selektieren ausschalten. Java Basics - Anfänger-Themen 7
M ArrayList<int[]> - Problem mit JList! Java Basics - Anfänger-Themen 27
M JList + ListModel Java Basics - Anfänger-Themen 26
L JList Aktualisieren funktioniert nur Zufällig Java Basics - Anfänger-Themen 3
T JList aktualisieren Java Basics - Anfänger-Themen 12
T alle Ordner in einem Ordner in JList anzeigen Java Basics - Anfänger-Themen 3
R .Jpg anzeigen lassen nach klick in JList Java Basics - Anfänger-Themen 11
F Hilfe! JList Inhalte vertauschen Java Basics - Anfänger-Themen 2
A Eintrag einer JLIST speichern Java Basics - Anfänger-Themen 3
A Anordnung von JList Elementen Java Basics - Anfänger-Themen 3
B JList wird nach Ändern weiß Java Basics - Anfänger-Themen 11
B Einträge im JList einfügen Java Basics - Anfänger-Themen 9
S JList mit icons UND strings für Dialogbox Java Basics - Anfänger-Themen 2
hdi Fehler beim Model-Update einer JList (DefaultListModel) Java Basics - Anfänger-Themen 3
DStrohma Index einer markierten Zeile aus einer JList bekommen? Java Basics - Anfänger-Themen 5
P JList in JPanel anzeigen Java Basics - Anfänger-Themen 2
hdi Synchronisation zwischen JList und ListModel Java Basics - Anfänger-Themen 6
D Suche in JList nach dem ersten Buchstaben Java Basics - Anfänger-Themen 2
hdi JList mit Model und Observer -> Chaos, blicke nicht durch Java Basics - Anfänger-Themen 22
1 JList Problem : Synchronisation mit Vector klappt nicht :( Java Basics - Anfänger-Themen 6
G Elemente aus jList entferne. Java Basics - Anfänger-Themen 2
G JList updaten Java Basics - Anfänger-Themen 7
K jList scrollPane Java Basics - Anfänger-Themen 2
7 Java Swing: Wie JScrollPane zur JList hinzufügen? Java Basics - Anfänger-Themen 12
K JList verschiebt sich Java Basics - Anfänger-Themen 7
G String in JList Java Basics - Anfänger-Themen 11
T Jlist Object hinzufügen Java Basics - Anfänger-Themen 2
B Auslesen der JList Java Basics - Anfänger-Themen 11
S jList Multiple Selection mit Klick Java Basics - Anfänger-Themen 2
M Dateien in einem Ordner, JList Java Basics - Anfänger-Themen 7
G JList größe verändert sich Java Basics - Anfänger-Themen 2
M JList Parameter verschieben Java Basics - Anfänger-Themen 3
C jList - Zeile Markieren - jList.setSelectedIndex(wert); Java Basics - Anfänger-Themen 3
G JList mit LinkedList füllen Java Basics - Anfänger-Themen 2
G JList Mehrfachselektion Java Basics - Anfänger-Themen 6
N 2 spaltige JList, mit dynamischen Inhalt Java Basics - Anfänger-Themen 4
P JList mit setListData(<Vector>) Java Basics - Anfänger-Themen 7
J GUI mit JList Java Basics - Anfänger-Themen 2
N drag and drop mit JList Java Basics - Anfänger-Themen 5
G 1. Buchstabe eines JList eintrages verschieden farbig machen Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben