我花了最后几个小时寻找解决方案或者至少是一个关于这个问题的体面指南,但一无所获。
我正在为我的一个小GUI实现一个自定义的Swing外观和感觉。到目前为止,我一直在使用UIManager.put("key", values);
方法取得了很好的成功,但是在适当修改JComboBoxes时我遇到了困难。
使用this list我设法使我的jComboBoxes非常接近我希望它们的样子:
我有两个问题,主要问题和次要问题:
显然,key
中没有UIDefaults
与两个边界有任何关系:它们似乎在某种程度上硬编码我正在修改的外观(应该是金属)。我使用手动扩展ComboBoxRenderer并设法得到这个:
package exec.laf.theme;
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
public class ComboBoxRenderer extends BasicComboBoxRenderer {
private Color background;
private Color selectionBackground;
public ComboBoxRenderer() {
super();
background = UIManager.getColor("ComboBox.background");
selectionBackground = UIManager.getColor("ComboBox.selectionBackground");
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
setText((String) value);
if (isSelected) setBackground(selectionBackground);
else setBackground(background);
return this;
}
}
我每次创建一个JComboBox时都指定这个Renderer:
aComboBox.setRenderer(new ComboBoxRenderer());
获得与非扩展JComboBox相同的外观。
问题是,通过这个扩展,我找不到触摸这些边界的方法。添加setBorder(new EmptyBorder(0, 0, 0, 0));
什么都不做,因为它只是为列出的项添加了边框。
我检查了javax.swing.plaf.basic.BasicComboBoxRenderer
的源代码以查看是否在那里应用了任何边框,但没有找到任何东西(唯一的边界是应用于列出的项目的那个,我可以覆盖如上所示。
我应该做些什么?我是在延长错误的课程,还是我错过了其他的东西?
我找到的解决方案是:
UIManager.put("ComboBox.borderPaintsFocus", Boolean.TRUE)
这会在ComboBoxUI中设置一个布尔值,以防止渲染焦点边框,焦点边框是聚焦时围绕所有按钮绘制的边框。它的风格取决于你的外观和感觉。
要删除comboBox PopUp的黑色边框,
Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
BasicComboPopup popup = (BasicComboPopup)child;
popup.setBorder(BorderFactory.createEmptyBorder());
如果我说得不够,你的问题通常是如何使用BasicComboBoxRenderer中的扩展类。所以这里有一个简单的代码来解释你如何使用它:
public class RenderComboBox extends BasicComboBoxRenderer {
Color selectedBackground;
Color selectedForground;
Color background;
Color forground;
public RenderComboBox() {
setOpaque(true);
background = new Color(37, 37, 37);
selectedBackground = new Color(93, 93, 93);
forground = Color.WHITE;
selectedForground = forground;
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected) {
setBackground(selectedBackground);
setForeground(selectedForground);
} else {
setBackground(background);
setForeground(forground);
}
setFont(list.getFont());
if (value == null) {
setText("");
} else {
setText(value.toString());
}
return this;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setLayout(null);
frame.setPreferredSize(new Dimension(200, 170));
JComboBox<String> combobox = new JComboBox<>();
combobox.setRenderer(new RenderComboBox());
combobox.setBounds(50, 50, 100, 20);
combobox.addItem("TEST");
combobox.addItem("REVERT");
frame.add(combobox);
frame.pack();
frame.setVisible(true);
}
}