更改聚焦 JComboBox 的默认颜色 (Java Swing/AWT)
Changing default colors for focused JComboBox (Java Swing/AWT)
嗨!
我想知道如何更改 JComboBox
的默认聚焦背景和前景。
因为我让它扩展了一个 DefaultListCellRenderer
,它正在修改它的每个项目的前景和背景,我不喜欢它在获得焦点时不尊重它们。
我试过 UIMnager.put("ComboBox.background", new ColorUIResource(my_color));
和其他一些键(实际上是我能找到的每一个键),就像 SwingUtilities
所做的第一件事一样,但没有任何成功。
我没有在这个程序中对 UIManager
做任何更改,之前和之后都没有,所以外观和感觉是默认的(金属),因为它最初是由 Java 13 提供的。
有办法吗?
编辑:
这是一个示例,可以了解我的意思:
package tests;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
final class ComboBoxTest implements Runnable {
public static void main(String[]arguments_) {
SwingUtilities.invokeLater(new ComboBoxTest());
}
@Override
public void run() {
JFrame frame_ = new JFrame("JComboBox Test");
JPanel panel_ = new JPanel(new GridLayout(3, 1));
JComboBox<String>
useless_box = new JComboBox<>()
, tested_box = new JComboBox<>(new String[] {
"<html>⛈</html>", "<html>☠</html>"
});
tested_box.setBackground(Color.ORANGE);
tested_box.setForeground(Color.RED.darker().darker());
tested_box.setFont(tested_box.getFont().deriveFont(48.f));
tested_box.setRenderer(new ComboRenderer());
panel_.add(new JPanel());
panel_.add(useless_box);
panel_.add(tested_box);
frame_.add(panel_);
frame_.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame_.setLocationRelativeTo(null);
frame_.pack();
frame_.setVisible(true);
}
private class ComboRenderer extends DefaultListCellRenderer {
/**
*
*/
private static final long serialVersionUID = -1329981614961331328L;
@Override
public Component getListCellRendererComponent (
JList<? extends Object>list_, Object value_
, int index_, boolean is_selected, boolean cell_has_focus
) {
super.getListCellRendererComponent (
list_, value_, index_, is_selected, cell_has_focus
);
setHorizontalAlignment(DefaultListCellRenderer.CENTER);
switch(index_) {
case -1:
setBackground(Color.ORANGE);
break;
default:
if(is_selected == true) {
setBackground(Color.ORANGE.darker());
} else {
setBackground(Color.ORANGE);
}
break;
}
setForeground(Color.RED.darker().darker());
return this;
}
}
}
第一个框(在中间)和JPanel
(在顶部)是为了看看第二个框在获得焦点或失去焦点时会发生什么,转移焦点或不完全转移焦点(通过单击 JPanel
而不是 JComboBox
本身或其他可选择的 JComponent
)。
i don't like that it doesn't respect them when it gains focus.
如果您不喜欢组合框获得焦点时的蓝色选择背景颜色,那么您可以使用:
UIManager.put("ComboBox.selectionBackground", new ColorUIResource(Color.ORANGE));
这可能适用于某些 LAF。但它将应用于应用程序中的所有组合框。
如果您只需要为单个组合框使用它,那么您需要编写自定义 ComboBoxUI。我不知道您需要重写哪些方法,但您可以在源代码中搜索“selectionBackground”以查看如何使用 属性。
嗨!
我想知道如何更改 JComboBox
的默认聚焦背景和前景。
因为我让它扩展了一个 DefaultListCellRenderer
,它正在修改它的每个项目的前景和背景,我不喜欢它在获得焦点时不尊重它们。
我试过 UIMnager.put("ComboBox.background", new ColorUIResource(my_color));
和其他一些键(实际上是我能找到的每一个键),就像 SwingUtilities
所做的第一件事一样,但没有任何成功。
我没有在这个程序中对 UIManager
做任何更改,之前和之后都没有,所以外观和感觉是默认的(金属),因为它最初是由 Java 13 提供的。
有办法吗?
编辑: 这是一个示例,可以了解我的意思:
package tests;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
final class ComboBoxTest implements Runnable {
public static void main(String[]arguments_) {
SwingUtilities.invokeLater(new ComboBoxTest());
}
@Override
public void run() {
JFrame frame_ = new JFrame("JComboBox Test");
JPanel panel_ = new JPanel(new GridLayout(3, 1));
JComboBox<String>
useless_box = new JComboBox<>()
, tested_box = new JComboBox<>(new String[] {
"<html>⛈</html>", "<html>☠</html>"
});
tested_box.setBackground(Color.ORANGE);
tested_box.setForeground(Color.RED.darker().darker());
tested_box.setFont(tested_box.getFont().deriveFont(48.f));
tested_box.setRenderer(new ComboRenderer());
panel_.add(new JPanel());
panel_.add(useless_box);
panel_.add(tested_box);
frame_.add(panel_);
frame_.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame_.setLocationRelativeTo(null);
frame_.pack();
frame_.setVisible(true);
}
private class ComboRenderer extends DefaultListCellRenderer {
/**
*
*/
private static final long serialVersionUID = -1329981614961331328L;
@Override
public Component getListCellRendererComponent (
JList<? extends Object>list_, Object value_
, int index_, boolean is_selected, boolean cell_has_focus
) {
super.getListCellRendererComponent (
list_, value_, index_, is_selected, cell_has_focus
);
setHorizontalAlignment(DefaultListCellRenderer.CENTER);
switch(index_) {
case -1:
setBackground(Color.ORANGE);
break;
default:
if(is_selected == true) {
setBackground(Color.ORANGE.darker());
} else {
setBackground(Color.ORANGE);
}
break;
}
setForeground(Color.RED.darker().darker());
return this;
}
}
}
第一个框(在中间)和JPanel
(在顶部)是为了看看第二个框在获得焦点或失去焦点时会发生什么,转移焦点或不完全转移焦点(通过单击 JPanel
而不是 JComboBox
本身或其他可选择的 JComponent
)。
i don't like that it doesn't respect them when it gains focus.
如果您不喜欢组合框获得焦点时的蓝色选择背景颜色,那么您可以使用:
UIManager.put("ComboBox.selectionBackground", new ColorUIResource(Color.ORANGE));
这可能适用于某些 LAF。但它将应用于应用程序中的所有组合框。
如果您只需要为单个组合框使用它,那么您需要编写自定义 ComboBoxUI。我不知道您需要重写哪些方法,但您可以在源代码中搜索“selectionBackground”以查看如何使用 属性。