Krieg keine CellRenderer Methode hin :(

Status
Nicht offen für weitere Antworten.

m!k3

Bekanntes Mitglied
Hallo,

also hab hier viele Beispiele durchgestörbert.

Ich benutze eine JList und möchte Farben setzen auf bestimme Zeilen der JList. Nun gut und schön - momentan ruf ich dann immer folgendes auf:

Code:
userlist_list.setCellRenderer(new DefaultListCellRenderer() 
{
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) 
    { 
        Component comp = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
        comp.setForeground(getColorFromString(theColors.get(index).toString())); 
        return comp; 
    } 
});

im Vector "theColors" stehen die Farben in der richtigen Reihenfolge.

Nun möchte ich nicht ständig den ganzen Code schreiben, sondern einfach eine Methode machen, der ich meinen Vector übergebe und der die Farben bei der JList anpasst.

Die JList ist public, drum brauch ichs nicht übergeben.

aber ich hab riesen probs mit dem "getListCellRenderer( ... )" 🙁
versteh sowieso nicht wie das ganze gesetzt wird.

Wenn ich mir vorm "comp.setForeground" den index ausgeben lasse, wird der immer doppelt ausgegeben, folglich werden die Farben immer doppelt gesetzt.. ändert zwar nix an der Richtigkeit, aber warum rennt der doppelt durch?!

Bei 3 List-Einträgen krieg ich folgendes zurück:

0
0
1
1
2
2

wieso? ???:L
 
Ich würd die Daten und die entsprechenden Colorobjekte zusammen in einem Vector speichern, dadurch wird das ganze viel einfacher zu warten.
Code:
import java.awt.*;
import java.awt.Component;
import java.util.Vector;

import javax.swing.*;
public class MyFrame extends JFrame
{
	private JList list;
	public MyFrame()
	{
		this.setSize(300, 300);

		Vector data = new Vector();
		data.add(new ListElement("aaa", Color.RED));
		data.add(new ListElement("bbb", Color.GREEN));
		data.add(new ListElement("ccc", Color.BLUE));
		data.add(new ListElement("ddd", Color.YELLOW));
		this.list = new JList(new MyListModel( data ));
		this.list.setCellRenderer(new DefaultListCellRenderer()
		{
			public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
			{
				Component comp = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
				comp.setForeground( ((ListElement ) ((MyListModel) list.getModel()).getListElementAt( index )).getColor()  );
				return comp;
			}
		});
		this.getContentPane().add( list );
		this.setVisible(true);
	}
	
	public static void main(String[] args)
	{
		new MyFrame();
	}
	
}

class MyListModel extends DefaultListModel
{
	private Vector data;
	public MyListModel(Vector data)
	{
		this.data = data;
	}
	
	
	public Object getElementAt(int index)
	{
		return ((ListElement)this.data.get( index )).getValue();
	}
	
	public Object getListElementAt(int index)
	{
		return this.data.get( index );
	}

	public int getSize()
	{
		return this.data.size();
	}
}

class ListElement
{
	private Color color;
	private Object value;
	
	public ListElement(Object value, Color color)
	{
		this.value = value;
		this.color = color;
	}
	
	public Color getColor()
	{
		return color;
	}

	public Object getValue()
	{
		return value;
	}

	public void setColor(Color color)
	{
		this.color = color;
	}

	public void setValue(Object object)
	{
		value = object;
	}
	
	public String toString()
	{
		return this.value.toString();
	}

}
 
hi footbar... is ja ein fetter quellcode.. erstmal danke...

die Liste wird ja ständig aktualisiert... so können sich also Elemente ändern und die Farben ebenfalls, ich möchte das irgendwie einfacher setzen können...

versteh das immer noch nicht wie das mit dem CellRenderer läuft.. wie der das setzt.. auch mit den doppelten Werten @ ersten eintrag.. hmm...
 
ich müsste jetzt eigentlich nur hier immer Data aktualisieren oder?! bzw. dann MyListModel aufrufen und den aktualisieren Vector übergeben

Code:
public MyListModel(Vector data) 
{ 
      this.data = data; 
}

verstehe ich das richtig? Somit setz ich am Anfang einmal den CellRenderer und das wars..
 
verstehe ich das richtig? Somit setz ich am Anfang einmal den CellRenderer und das wars..
Genau.
ich müsste jetzt eigentlich nur hier immer Data aktualisieren oder?! bzw. dann MyListModel aufrufen und den aktualisieren Vector übergeben
Den Vector austauschen brauchst du normalerweise gar nicht. Wenn du Elemente hinzufügen oder löschen willst, machst du das über das MyListModel. Die entsprechenden Methoden mußt du noch implementieren.
 
du footbar.. wie wirdn das dann aufgerufen?! Hab so ne Klassen verschachtelung noch nie gemacht 🙁

ähm.. könntest mir vielleicht ein beispiel in der main methode zeigen.. also ich möchte jetzt Data setzen.. bzw. alle von der Liste removen und neu setzen..

versteh ich au nicht so recht was nun diese zeile genau macht:

comp.setForeground( ((ListElement ) ((MyListModel) list.getModel()).getListElementAt( index )).getColor() );

also setForeground is klar.. aber dann der komische Aufruf.. mhh
 
Hier ist das ganze mal etwas ausführlicher mit einer Methode um dem Model einen neuen Vector zu übergeben.
Code:
import java.awt.*;
import java.awt.Component;
import java.util.Vector;

import javax.swing.*;
public class MyFrame extends JFrame
{
	private JList list;
	public MyFrame()
	{
		this.setSize(300, 300);

		Vector data = new Vector();
		data.add(new ListElement("aaa", Color.RED));
		data.add(new ListElement("bbb", Color.GREEN));
		data.add(new ListElement("ccc", Color.BLUE));
		data.add(new ListElement("ddd", Color.YELLOW));
		this.list = new JList(new MyListModel( data ));
		this.list.setCellRenderer(new DefaultListCellRenderer()
		{
			public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
			{
				Component comp = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
				MyListModel model = (MyListModel) list.getModel();  // Model aus Liste holen und entsprechend casten
				ListElement element = model.getListElementAt(index); // Element aus Model holen
				Color color = element.getColor(); // aktuelles Colorobjekt aus Element holen
				comp.setForeground( color ); // Colorobjekt uebergeben
				//comp.setForeground( ((ListElement ) ((MyListModel) list.getModel()).getListElementAt( index )).getColor()  );
				return comp;
			}
		});
		
		// ###################################################
		// #### add new data
		
		Vector newData = new Vector();
		newData.add(new ListElement("eee", Color.YELLOW));
		newData.add(new ListElement("fff", Color.GREEN));
		newData.add(new ListElement("ggg", Color.RED));
		newData.add(new ListElement("hhh", Color.YELLOW));

		((MyListModel)this.list.getModel()).setData( newData );
		
		// ##################################################
		
		this.getContentPane().add( list );
		this.setVisible(true);
	}
	
	public static void main(String[] args)
	{
		new MyFrame();
		
	}
	
}

class MyListModel extends DefaultListModel
{
	private Vector data;
	public MyListModel(Vector data)
	{
		this.data = data;
	}

	public void setData(Vector data)
	{
		this.data = data;
		this.fireContentsChanged(this, 0, this.data.size());
	}
	
	public Object getElementAt(int index)
	{
		return ((ListElement)this.data.get( index )).getValue();
	}
	
	public ListElement getListElementAt(int index)
	{
		return (ListElement) this.data.get( index );
	}

	public int getSize()
	{
		return this.data.size();
	}
}

class ListElement
{
	private Color color;
	private Object value;
	
	public ListElement(Object value, Color color)
	{
		this.value = value;
		this.color = color;
	}
	
	public Color getColor()
	{
		return color;
	}

	public Object getValue()
	{
		return value;
	}

	public void setColor(Color color)
	{
		this.color = color;
	}

	public void setValue(Object object)
	{
		value = object;
	}
	
	public String toString()
	{
		return this.value.toString();
	}

}
P.S. Mein Name ist foobar ;-)
 
oh so sorry foobar 😳 *peinlich

ähm.. aber.. du änderst den inhalt nicht in der main methode.. sondern in MyFrame..

ich muss ja während einer Sitzung die Liste aktualisieren.. und folgendes geht nicht 🙁

Code:
new MyFrame();
data.add(new ListElement("123", Color.BLACK)); 
data.add(new ListElement("456", Color.GREEN)); 
data.add(new ListElement("789", Color.BLUE)); 
data.add(new ListElement("000", Color.YELLOW));
list = new JList( new MyListModel( data ));

hab alles public mäßig deklariert.. nur ich müsste jetzt wieder das hier aufrufen:

Code:
this.list.setCellRenderer(new DefaultListCellRenderer()

und somit spar ich mir ja wieder kein Code..
 
also ich habs jetzt hingebracht,

aber habe folgendes Problem foobar.. wenn ich die Color setze.. hab ne Methode in MyListModel gebaut, die halt die Methode in ListElement aufruft... wird die Farbe zwar gesetzt, nur nicht aktualisiert.. also ich sehe immer noch die alte Farbe in der JList.. wenn ich aus dem Fenster rausklicke und wieder reinklicke.. also ohne direkt auf die List zu drücken sondern nur auf den Frame... wird die Farbe aktualisiert...

Warum ist das so?!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben