Я пишу GUI с помощью Swing. У меня есть на заказ письмо JComboBox
с использованием ListCellRenderer
и BasicComboBoxEditor
.Изменить цвет выделения (после выбора) в JComboBox
В моем методе getListCellRendererComponent()
я изменяю цвет списка в зависимости от того, выбран ли элемент (мышь висит выше), что приятно и все, но я не хочу, чтобы выбор менял цвет фона после выбора, который он делает в настоящее время.
Первое изображение показывает, как выглядит интерфейс перед выбором, а второй показывает, как он выглядит.
ВОПРОС
Как изменить фон "выбор" в "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
Я добавил MCVE и, как вы можете видеть, что это «проблема», что JComboBox сфокусирован, что имеет отношение к моему вопросу. Я добавил кнопку рядом с ComboBox, чтобы помочь удалить фокус из ComboBox.
Просто сделайте setFocusable(false)
, исправьте его, но также уберите часть функциональности остальной части программы, так что это нежелательно.
Не очень это я искал. Я полагаю, что моя проблема связана с тем, что «JComboBox» «сфокусирован», потому что, как только я убеждаюсь, что какой-то другой элемент сфокусирован, «JComboBox» выглядит так, как я хочу. Спасибо, в любом случае. – Zeliax
моя проблема связана с тем, что JComboBox «сфокусирован» == 'isSelected' или' cellHasFocus', оба имеют отношение к 'JList.setSelectionForeground' /' Background', без идеи без вашего кода в форме SSCCE/MCVE – mKorbel
Я добавлю MCVE, когда я получу время, чтобы лучше объяснить мою проблему. И да. Я уверен, что вы правы в части JList. – Zeliax