【发布时间】:2015-02-25 03:22:40
【问题描述】:
我在过去的几个小时里一直在寻找解决方案,或者至少是一个关于这个问题的体面指南,但什么也没找到。
我正在为我的一个小型 GUI 实现自定义 Swing 外观。到目前为止,我一直在使用UIManager.put("key", values); 方法取得了很好的成功,但是在正确修改 JComboBoxes 时我被卡住了。
使用 this list 我设法让我的 jComboBoxes 非常接近我想要的样子:
我有两个问题,一个主要的和一个次要的:
-
专业
我希望蓝色边框消失。
-
次要
我真的希望黑色边框消失。
显然UIDefaults 中的key 与这两个边界没有任何关系:它们似乎以某种方式硬编码在我正在修改的外观(应该是金属)中。我求助于手动扩展 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 时,我都会指定此渲染器,如下所示:
aComboBox.setRenderer(new ComboBoxRenderer());
获得与非扩展 JComboBox 相同的外观。
问题在于,有了这个扩展,我找不到触及这些边界的方法。添加setBorder(new EmptyBorder(0, 0, 0, 0)); 没有任何作用,因为它只是为列出的项目添加了一个边框。
我检查了javax.swing.plaf.basic.BasicComboBoxRenderer 的源代码,看看那里是否应用了任何边框,但什么也没找到(唯一的边框是应用于列出的项目的那个,我可以如上所示覆盖它。
我该怎么办?我是扩展了错误的课程,还是我错过了其他东西?
【问题讨论】:
-
实现您自己的外观和感觉委托。 Modifying the Look and Feel
-
@MadProgrammer 我似乎找不到任何关于在该链接中实际修改 LaF 的信息,它似乎集中在将现有的应用到 GUI 上。
-
查看jdk中的src.jar,看看Java自带的实现
-
BasicComboBoxEditor中的边框应该是null,但是子类可以做其他事情。 -
@trashgod 我也尝试扩展编辑器,但一无所获。