Hey,
ich steh grad vor einem Verständnisproblem in Bezug auf den ListCellRenderer einer JList und einem externen Look And Feel. Ich nutze ein LAF des Substance Pakets, genauer das SubstanceGraphiteAquaLookAndFeel. Das sieht so aus dass er die Listeneinträge bei der Auswahl blau unterlegt, und auch beim Mouse-Over einen blauen Effekt ein-/ausblendet. Also der CellRenderer reagiert nicht nur auf Klicks, sondern eben auch auf mouseEntered/mouseExited.
Soweit als Info. Ich hab jetzt in meinem Programm eine JList, per Default-Konstruktor:
Ich hab grad etwas den Source Code von JList überflogen, ist recht verwirrend Es gibt da zumindest eine updateUI() Methode, und irgendwas vonwegen setUI((ListUI)UIManager.getUI(this));, naja wie auch immer. In dem Zuge der JList Erstellung wird ja wohl irgendwo auch ein standard-mässiger ListCellRenderer zugewiesen, und der kommt ja offensichtlich aus dem LAF.
Jetzt versuche ich, den CellRenderer etwas abzuändern, denn ich möchte bei jedem Listenelement vor dem Text zudem noch ein kleines Icon anzeigen. Ich muss auf dem bestehenden CellRenderer aufbauen, weil ich ja keine Ahnung habe wie genau der Code davon aussieht, deshalb hab ich mal so anfgefangen:
Im Programm dann:
Da das Interface ListCellRenderer ja nur diese eine obige Methode vorschreibt, und ich in dieser Methode nix weiter mach als das zu returnen, was der alte CellRenderer auch schon zurückliefert,habe ich eigentlich erwartet dass das erstmal gar keinen Unterschied macht.
Stimmt aber nicht: Zwar sehen die Einträge "statisch" noch so aus wie vorher, auch wenn sie markiert sind, allerdings sind die Effekte beim Mouse-Over weg. Versteh ich nicht.. Ich dachte es liegt halt ein MouseListener auf der Component, die die getListCellRenderer() Methode dieses CellRenderers returned. Aber das ist ja offensichtlich nicht so, weil der jetzt scheinbar weg ist.
Also ist die erste Frage: Wo ist der hin? Bzw wo kam der denn usprünglich her?
Naja ok, dachte ich mir erstmal die Mouse-Over Effekte sind nicht so wichtig, ansonsten sieht's ja noch gleich aus, die Elemente sind beim Anwählen ja schon noch mit dem selben blauen Effekt hinterlegt wie schon ursprünglich. Also wollte ich nun mein Icon davorklatschen (erstmal ein JLabel mit Text statt Icon, testweise) und ändere meine Klasse:
Über zwei Dinge hab ich mich gewundert als ich das Programm dann gestartet hab:
1) dachte ich eigentlich dass nach jedem GUI Update die "c"-Komponente mehrmals hintereinander angezeigt wird, denn immerhin mach ich bei jedem Methodenaufruf ein add(c), aber niemals ein remove. Aber ich schätze diese Methode ist ja sowas wie paintComponent() und wird zur Laufzeit immer wieder aufgerufen. Das wär meine zweite Frage.
Aber noch viel verwrrender: Jetzt fehlen auf einmal wirklich sämtliche Effekte, "c" enthält scheinbar wirklich nur den String (bzw halt ein kleines JLabel), den die toString() Methode meiner Listenobjekte zurückliefert. Von blauer Markierung whatsoever keine Spur mehr...
Also ich peil das nicht.. Wenn der CellRenderer gar nicht für all diese Effekte zuständig ist, wer denn dann? Das ist meine dritte Frage.
Ich weiß jetzt gar nicht ob das hier nur so der Fall ist da ich ein externes LAF nutze, oder ob das jetzt mit Java-eigenen LAF's auch so ist.
Ich hoffe ihr könnt mir meine Fragen beantworten!
Danke!
ich steh grad vor einem Verständnisproblem in Bezug auf den ListCellRenderer einer JList und einem externen Look And Feel. Ich nutze ein LAF des Substance Pakets, genauer das SubstanceGraphiteAquaLookAndFeel. Das sieht so aus dass er die Listeneinträge bei der Auswahl blau unterlegt, und auch beim Mouse-Over einen blauen Effekt ein-/ausblendet. Also der CellRenderer reagiert nicht nur auf Klicks, sondern eben auch auf mouseEntered/mouseExited.
Soweit als Info. Ich hab jetzt in meinem Programm eine JList, per Default-Konstruktor:
Java:
JList list = new JList();
Ich hab grad etwas den Source Code von JList überflogen, ist recht verwirrend Es gibt da zumindest eine updateUI() Methode, und irgendwas vonwegen setUI((ListUI)UIManager.getUI(this));, naja wie auch immer. In dem Zuge der JList Erstellung wird ja wohl irgendwo auch ein standard-mässiger ListCellRenderer zugewiesen, und der kommt ja offensichtlich aus dem LAF.
Jetzt versuche ich, den CellRenderer etwas abzuändern, denn ich möchte bei jedem Listenelement vor dem Text zudem noch ein kleines Icon anzeigen. Ich muss auf dem bestehenden CellRenderer aufbauen, weil ich ja keine Ahnung habe wie genau der Code davon aussieht, deshalb hab ich mal so anfgefangen:
Java:
public class MyListCellRenderer implements ListCellRenderer {
private ListCellRenderer original;
public MyListCellRenderer(ListCellRenderer original) {
this.original = original;
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
return original.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
}
}
Im Programm dann:
Java:
JList list = new JList();
list.setCellRenderer(new MyListCellRenderer(list.getCellRenderer()));
Da das Interface ListCellRenderer ja nur diese eine obige Methode vorschreibt, und ich in dieser Methode nix weiter mach als das zu returnen, was der alte CellRenderer auch schon zurückliefert,habe ich eigentlich erwartet dass das erstmal gar keinen Unterschied macht.
Stimmt aber nicht: Zwar sehen die Einträge "statisch" noch so aus wie vorher, auch wenn sie markiert sind, allerdings sind die Effekte beim Mouse-Over weg. Versteh ich nicht.. Ich dachte es liegt halt ein MouseListener auf der Component, die die getListCellRenderer() Methode dieses CellRenderers returned. Aber das ist ja offensichtlich nicht so, weil der jetzt scheinbar weg ist.
Also ist die erste Frage: Wo ist der hin? Bzw wo kam der denn usprünglich her?
Naja ok, dachte ich mir erstmal die Mouse-Over Effekte sind nicht so wichtig, ansonsten sieht's ja noch gleich aus, die Elemente sind beim Anwählen ja schon noch mit dem selben blauen Effekt hinterlegt wie schon ursprünglich. Also wollte ich nun mein Icon davorklatschen (erstmal ein JLabel mit Text statt Icon, testweise) und ändere meine Klasse:
Java:
public class MyListCellRenderer extends JPanel implements ListCellRenderer {
private ListCellRenderer original;
private JLabel iconLabel;
public MyListCellRenderer(ListCellRenderer original) {
this.original = original;
iconLabel = new JLabel("TEST");
setLayout(new FlowLayout(FlowLayout.LEADING, 0, 0));
add(iconLabel);
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
Component c = original.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
add(c);
return this;
}
}
Über zwei Dinge hab ich mich gewundert als ich das Programm dann gestartet hab:
1) dachte ich eigentlich dass nach jedem GUI Update die "c"-Komponente mehrmals hintereinander angezeigt wird, denn immerhin mach ich bei jedem Methodenaufruf ein add(c), aber niemals ein remove. Aber ich schätze diese Methode ist ja sowas wie paintComponent() und wird zur Laufzeit immer wieder aufgerufen. Das wär meine zweite Frage.
Aber noch viel verwrrender: Jetzt fehlen auf einmal wirklich sämtliche Effekte, "c" enthält scheinbar wirklich nur den String (bzw halt ein kleines JLabel), den die toString() Methode meiner Listenobjekte zurückliefert. Von blauer Markierung whatsoever keine Spur mehr...
Also ich peil das nicht.. Wenn der CellRenderer gar nicht für all diese Effekte zuständig ist, wer denn dann? Das ist meine dritte Frage.
Ich weiß jetzt gar nicht ob das hier nur so der Fall ist da ich ein externes LAF nutze, oder ob das jetzt mit Java-eigenen LAF's auch so ist.
Ich hoffe ihr könnt mir meine Fragen beantworten!
Danke!
Zuletzt bearbeitet: