Ich schreibe eine GUI mit Swing. Ich habe eine benutzerdefinierte geschrieben JComboBox
mit einem ListCellRenderer
und einem BasicComboBoxEditor
.Ändern Sie die Farbe der Auswahl (nach Auswahl) in einer JComboBox
In meiner getListCellRendererComponent()
Methode ändere ich die Farbe der Liste basierend darauf, ob das Element "ausgewählt" ist (die Maus schwebt oben), das ist nett und alle, aber ich möchte nicht die Auswahl Hintergrundfarbe ändern sobald eine Entscheidung getroffen wurde, was sie gerade tut.
Das erste Bild zeigt, wie das Interface aussieht, bevor eine Auswahl getroffen wurde, und das zweite zeigt, wie es aussieht.
FRAGE
Wie ändere ich den Hintergrund der "Auswahl" auf die "stockColor"?
MCVE
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.plaf.basic.BasicComboBoxEditor;
public class TFComboBox extends JComboBox{
public static void main(String[] args){
createAndShowGUI();
}
public static void createAndShowGUI(){
JFrame frame = new JFrame("MCVE");
JPanel pane = new JPanel(new BorderLayout());
TFComboBox cb = new TFComboBox();
boolean[] tf = {true, false};
cb.addItems(tf);
JButton b = new JButton("Click me!");
pane.add(cb, BorderLayout.CENTER);
pane.add(b, BorderLayout.LINE_END);
frame.add(pane);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
private DefaultComboBoxModel model;
private Vector<Boolean> comboBoxItems;
private JComboBox comboBox;
public TFComboBox(){
comboBoxItems = new Vector<Boolean>();
comboBoxItems.add(Boolean.TRUE);
comboBoxItems.add(Boolean.FALSE);
comboBox = new JComboBox(comboBoxItems);
model = new DefaultComboBoxModel();
setModel(model);
setRenderer(new TrueFalseComboRenderer());
setEditor(new TrueFalseComboEditor());
}
public void addItems(boolean[] items){
for(boolean anItem : items){
model.addElement(anItem);
}
}
}
class TrueFalseComboRenderer extends JPanel implements ListCellRenderer {
private JLabel labelItem = new JLabel();
private Color stockColor = labelItem.getBackground();
public TrueFalseComboRenderer(){
setLayout(new BorderLayout());
labelItem.setOpaque(true);
labelItem.setHorizontalAlignment(JLabel.CENTER);
add(labelItem);
setBackground(Color.LIGHT_GRAY);
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
boolean tempValue = (boolean) value;
labelItem.setText(Boolean.toString(tempValue));
if(isSelected){
labelItem.setBackground(stockColor.darker());
labelItem.setForeground(Color.WHITE);
} else {
labelItem.setBackground(stockColor);
labelItem.setForeground(Color.BLACK);
}
return this;
}
}
class TrueFalseComboEditor extends BasicComboBoxEditor {
private JLabel labelItem = new JLabel();
private JPanel panel = new JPanel();
private Object selectedItem;
public TrueFalseComboEditor() {
labelItem.setOpaque(false);
labelItem.setHorizontalAlignment(JLabel.CENTER);
labelItem.setForeground(Color.WHITE);
panel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 2));
panel.setBackground(Color.BLUE);
panel.add(labelItem);
}
public Component getEditorComponent(){
return this.panel;
}
public Object getItem(){
return this.selectedItem;
}
public void setItem(Object item){
if(item == null){
return;
}
this.selectedItem = item;
labelItem.setText(item.toString());
}
}
EDIT
Ich habe eine MCVE hinzugefügt und wie man sehen kann es das „Problem“ ist, dass die JComboBox konzentriert sich das mit meiner Frage zu tun hat. Ich habe eine Schaltfläche neben der ComboBox platziert, um den Fokus von der ComboBox zu entfernen.
Einfach tun setFocusable(false)
würde es beheben, aber auch etwas von der Funktionalität des Rests des Programms wegnehmen, so dass dies nicht gewünscht ist.
Nicht wirklich das habe ich gesucht. Ich nehme an, dass mein Problem damit zu tun hat, dass die 'JComboBox' 'fokussiert' ist, denn sobald ich sicher bin, dass ein anderes Element fokussiert ist, sieht die' JComboBox' so aus, wie ich es möchte. Danke trotzdem. – Zeliax
mein Problem hat etwas damit zu tun, dass die JComboBox "fokussiert" ist == 'isSelected' oder' cellHasFocus', beide haben mit 'JList.setSelectionForeground' /' Background' zu tun, keine Idee ohne Ihren Code im SSCCE/MCVE-Formular – mKorbel
Ich werde ein MCVE hinzufügen, wenn ich Zeit habe, mein Problem besser zu erklären. Und ja. Ich bin mir ziemlich sicher, dass Sie mit dem JList Teil recht haben. – Zeliax