Hallo zusammen,
ich versuche gerade verzweifelt einen ListCellRenderer für eine JList zu implementieren, welcher mir Objekte anzeigt, die von JPanel erben.
Ich habe ein ListModel, in welchem Objekte vom Typ Group stecken. Group erbt von JPanel und enthält mehrere Elemente (im Beispiel Labels mit Text und Farbe).
Diese Group-Panels möchte ich mir jetzt in einer JList anzeigen lassen. Ich bekomme das aber nur so hin, dass er mir immer NEUE Instanzen anzeigt, nicht aber die schon bestehenden aus dem ListModel (siehe auch Kommentar).
Was mache ich falsch? Wo ist mein Denkfehler?
Vielen Dank für Tipps oder Links zu einem vergleichbaren Beispiel!
i.b.fan
Edit: Wenn ich mir die Group-Panels einzeln anzeigen lasse, werden sie korrekt dargestellt
Ich habe den Code zusammengefasst und vereinfacht:
[Java]
package testlistcellrenderer;
import java.awt.EventQueue;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){@Override public void run(){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new GroupListView());
frame.pack();
frame.setVisible(true);
}});
}
}
[/Java]
[Java]
package testlistcellrenderer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.ScrollPane;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
public class GroupListView extends ScrollPane{
private DefaultListModel listModel;
JList list;
public GroupListView(){
listModel = new DefaultListModel();
listModel.addElement(new Group("Hans", 23, Color.RED));
listModel.addElement(new Group("Bert", 54, Color.GREEN));
listModel.addElement(new Group("Gabi", 12, Color.BLUE));
list = new JList(listModel);
MyListRenderer renderer = new MyListRenderer();
list.setCellRenderer(renderer);
this.add(list);
this.setVisible(true);
}
public class MyListRenderer extends JPanel implements ListCellRenderer{
public MyListRenderer(){
setOpaque(true);
this.setAlignmentX(CENTER_ALIGNMENT);
this.setAlignmentY(CENTER_ALIGNMENT);
this.setPreferredSize(new Dimension(200, 30));
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus){
if (isSelected) {
setBackground(Color.GREEN);
} else {
setBackground(Color.GRAY);
}
/* UND HIER SITZT DER WURM DRIN
* es soll ja das schon vorhandene Group-Panel (JPanel) malen
* aber egal was ich mache, es legt immer ein NEUES JPanel an
* oder wenn ich MyListRenderer Group extenden lasse, dann eben
* ein NEUES Group-Panel.
* wie kriege ich ihn dazu, "value" anzuzeigen???
*/
return this;
}
}//end class MyList
public class Group extends JPanel{
public Group(String name, int nummer, Color farbe){
JLabel eins = new JLabel(name);
JLabel zwei = new JLabel("Hausnummer: " + nummer);
eins.setForeground(farbe);
eins.setBackground(Color.BLACK);
zwei.setForeground(Color.BLACK);
zwei.setBackground(farbe);
this.add(eins);
this.add(zwei);
this.setVisible(true);
System.out.println("is EDT: " + SwingUtilities.isEventDispatchThread());
}
}//end class Group
}//end class GroupListView
[/Java]
ich versuche gerade verzweifelt einen ListCellRenderer für eine JList zu implementieren, welcher mir Objekte anzeigt, die von JPanel erben.
Ich habe ein ListModel, in welchem Objekte vom Typ Group stecken. Group erbt von JPanel und enthält mehrere Elemente (im Beispiel Labels mit Text und Farbe).
Diese Group-Panels möchte ich mir jetzt in einer JList anzeigen lassen. Ich bekomme das aber nur so hin, dass er mir immer NEUE Instanzen anzeigt, nicht aber die schon bestehenden aus dem ListModel (siehe auch Kommentar).
Was mache ich falsch? Wo ist mein Denkfehler?
Vielen Dank für Tipps oder Links zu einem vergleichbaren Beispiel!
i.b.fan
Edit: Wenn ich mir die Group-Panels einzeln anzeigen lasse, werden sie korrekt dargestellt
Ich habe den Code zusammengefasst und vereinfacht:
[Java]
package testlistcellrenderer;
import java.awt.EventQueue;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){@Override public void run(){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new GroupListView());
frame.pack();
frame.setVisible(true);
}});
}
}
[/Java]
[Java]
package testlistcellrenderer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.ScrollPane;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
public class GroupListView extends ScrollPane{
private DefaultListModel listModel;
JList list;
public GroupListView(){
listModel = new DefaultListModel();
listModel.addElement(new Group("Hans", 23, Color.RED));
listModel.addElement(new Group("Bert", 54, Color.GREEN));
listModel.addElement(new Group("Gabi", 12, Color.BLUE));
list = new JList(listModel);
MyListRenderer renderer = new MyListRenderer();
list.setCellRenderer(renderer);
this.add(list);
this.setVisible(true);
}
public class MyListRenderer extends JPanel implements ListCellRenderer{
public MyListRenderer(){
setOpaque(true);
this.setAlignmentX(CENTER_ALIGNMENT);
this.setAlignmentY(CENTER_ALIGNMENT);
this.setPreferredSize(new Dimension(200, 30));
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus){
if (isSelected) {
setBackground(Color.GREEN);
} else {
setBackground(Color.GRAY);
}
/* UND HIER SITZT DER WURM DRIN
* es soll ja das schon vorhandene Group-Panel (JPanel) malen
* aber egal was ich mache, es legt immer ein NEUES JPanel an
* oder wenn ich MyListRenderer Group extenden lasse, dann eben
* ein NEUES Group-Panel.
* wie kriege ich ihn dazu, "value" anzuzeigen???
*/
return this;
}
}//end class MyList
public class Group extends JPanel{
public Group(String name, int nummer, Color farbe){
JLabel eins = new JLabel(name);
JLabel zwei = new JLabel("Hausnummer: " + nummer);
eins.setForeground(farbe);
eins.setBackground(Color.BLACK);
zwei.setForeground(Color.BLACK);
zwei.setBackground(farbe);
this.add(eins);
this.add(zwei);
this.setVisible(true);
System.out.println("is EDT: " + SwingUtilities.isEventDispatchThread());
}
}//end class Group
}//end class GroupListView
[/Java]
Zuletzt bearbeitet: