2016-05-26 4 views
0

Ich versuche, eine JComboBox zu verwenden, um zwischen verschiedenen Instanzen einer Klasse von mir selbst geschrieben zu wählen, für die ich bereits eine Renderer Klasse implementiert:ComboBox mit eigenen Objekten

class BackupJobRenderer extends JLabel implements ListCellRenderer { 
private static final Color HIGHLIGHT_COLOR = new Color(0, 0, 128); 

public BackupJobRenderer() { 
    setOpaque(true); 
    setHorizontalAlignment(CENTER); 
    setVerticalAlignment(CENTER);} 

public Component getListCellRendererComponent(JList list, Object value, 
               int index, boolean isSelected, boolean cellHasFocus) { 
    BackupJob bjob = (BackupJob) value; 
    setText(bjob.getName()); 


    if (isSelected) { 
     setBackground(HIGHLIGHT_COLOR); 
     setForeground(Color.white); 
    } else { 
     setBackground(Color.white); 
     setForeground(Color.black); 
    } 
    return this; 
} 

Wenn ich versuche, initialisieren Sie die ComboBox wie folgt aus:

//backMan.getArrayJobs returns an Array of BackupJobs 
comboBoxJobs = new JComboBox(backMan.getArrayJobs()); 
comboBoxJobs.setRenderer(new BackupJobRenderer()); 
comboBoxJobs.setMaximumRowCount(3); 
comboBoxJobs.setEnabled(true); 

die ComboBox leer bleibt, obwohl nach dem Debugger, scheinen die Array-Elemente, die in der ComboBox „Datenmodell“ zu sein.

Was mache ich hier falsch?

+0

Für beste Antworten erstellen und veröffentlichen Sie Ihre [MCVE]. Beachten Sie, dass es normalerweise besser ist, den DefaultListCellRenderer zu erweitern, als den ListCellRenderer zu implementieren. [Zum Beispiel] (http://stackoverflow.com/a/37398879/522444) –

Antwort

1

Erstellen DefaultComboBoxModel und legen Sie das Array zu diesem Modell wie folgt.

DefaultComboBoxModel model = new DefaultComboBoxModel<>(yourObjectArray); 
JComboBox<Object> combo = new JComboBox<>(model); 
combo.setRenderer(new BackupJobRenderer()); 

Ihre Renderer Klasse sollte sein:

class BackupJobRenderer extends DefaultListCellRenderer { 

public Component getListCellRendererComponent(......) { 
JLabel label = (JLabel)super.getListCellRendererComponent(list,value,index,isSelected,cellHasFocus); 

if(value !=null && value instanceof BackupJob) { 
BackupJob backup = (BackupJob) value; 
label.setText(backup.getName()); 


if (isSelected) { 
    label.setBackground(HIGHLIGHT_COLOR); 
    label.setForeground(Color.white); 
} else { 
    label.setBackground(Color.white); 
    label.setForeground(Color.black); 
} 
} 
return label; 
} 
} 
+0

@Hovercraft voller Eela ... Hier -> https://docs.oracle.com/javase/7/docs/api/javax /swing/plaf/basic/BasicComboBoxRenderer.html –

+0

zunächst, vielen Dank für Ihre Antwort. Ich habe alles nach deinem Beispiel gemacht und es hat immer noch nicht funktioniert. Deshalb habe ich versucht, die Namen der Job-Objekte in das Kombinationsfeld zu schreiben und es hat auch nicht funktioniert, also denke ich, dass etwas fundamentaleres mit meinem UI falsch ist. Ich überprüfte das Datamodel noch einmal und alle Jobs waren darin ... – yungaero

+0

@yungaero: deshalb müssen Sie eine gültige [mcve] verursachen und nachtragen. Bitte lesen Sie den Link. –