JComboBox в настоящее время выбрал элемент фона и Windows L&F
Я не мог найти другой путь тогда:
UIManager.put("ComboBox.background",new Color(31,0,104));
UIManager.put("ComboBox.selectionBackground",new Color(31,0,104));
установить цвет фона выбранного элемента в JComboBox. К сожалению, это будет работать одинаково для всех списков в окне, которое я не хочу.
Вот как это работает в настоящее время: КАРТИНКА
Вот как я хочу, чтобы он себя вел: КАРТИНА
Я попытался создать собственный DefaultListCellRenderer и вызвать там setBackground, но это не помогло. Я также попытался переопределить BasicComboBoxUI, но я, вероятно, не знаю, какой метод мне следует переопределить для достижения результата.
РЕДАКТИРОВАТЬ: Это короткая часть моего кода в соответствии с предложением, но это не помогло
public void colorizeComboBox(){
jComboBox1.setRenderer(new ColourListCellRenderer());
jComboBox1.setUI(new BasicComboBoxUI(){
@Override
protected JButton createArrowButton() {
JButton b = this.createCustomArrowButton();
b.setContentAreaFilled(false);
b.setBackground(new Color(31,0,104));
b.setBorder(BorderFactory.createEmptyBorder());
return b;
}
public JButton createCustomArrowButton() {
JButton b=new JButton(new ImageIcon(getClass().getResource("/server/Pictures/arrowdown.png")));
b.setBorder(new EmptyBorder(0, 0, 0, 0));
b.setOpaque(true);
return b;
}
});
и пользовательский рендер:
public static class ColourListCellRenderer extends DefaultListCellRenderer {
@Override
public Color getBackground() {
return new Color(31,0,104);
}
}
но теперь все изменилось: фон текущего выбранного элемента - БЕЛЫЙ.
ОК, наконец, нашел решение:
jComboBox1.setUI(new BasicComboBoxUI(){
@Override
public void paintCurrentValueBackground(Graphics g,Rectangle bounds,boolean hasFocus){
Color t = g.getColor();
if ( comboBox.isEnabled() )
g.setColor(new Color(31,0,104));
else
g.setColor(DefaultLookup.getColor(comboBox, this,
"ComboBox.disabledBackground", null));
g.fillRect(bounds.x,bounds.y,bounds.width,bounds.height);
g.setColor(t);
}
});
jComboBox1.setFocusable(false);
Мне пришлось переопределить paintCurrentValueBackground(..) в BasicComboBoxUI, затем установить этот интерфейс в поле со списком, но фокус все еще создавал проблему и рисовать поле со списком в серый, поэтому я отключил фокус на этом поле со списком
2 ответа
Переопределите метод getBackground DefaultListCellRenderer и метод getListCellRendererComponent.
public class ColoredListCellRenderer extends DefaultListCellRenderer {
private Color selectedColor;
private Color backgroundColor;
private Color lastColor;
public ColoredListCellRenderer(Color backgroundColor, Color selectedColor) {
this.selectedColor = selectedColor;
this.backgroundColor = backgroundColor;
lastColor = backgroundColor;
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (isSelected) {
lastColor = selectedColor;
} else {
lastColor = backgroundColor;
}
c.setBackground(lastColor);
return c;
}
@Override
public Color getBackground() {
return lastColor;
}
}
Ответ OP перешел от вопроса к ответу:
Хорошо, наконец нашел решение:
jComboBox1.setUI(new BasicComboBoxUI(){ @Override public void paintCurrentValueBackground(Graphics g,Rectangle bounds,boolean hasFocus){ Color t = g.getColor(); if ( comboBox.isEnabled() ) g.setColor(new Color(31,0,104)); else g.setColor(DefaultLookup.getColor(comboBox, this, "ComboBox.disabledBackground", null)); g.fillRect(bounds.x,bounds.y,bounds.width,bounds.height); g.setColor(t); } }); jComboBox1.setFocusable(false);
Мне пришлось переопределить paintCurrentValueBackground (..) в BasicComboBoxUI, затем установить этот пользовательский интерфейс в поле со списком, но фокус все еще создавал проблему и рисовал поле со списком в серый цвет, поэтому я отключил фокус на этом поле со списком