Java 为什么';我的组合框不能正确更新颜色吗?
我在我的程序中实现了一个暗模式,除了一个组合框,它不想改变我想要的颜色,其他一切都很好 如您所见,组合框的“弹出窗口”可以很好地改变颜色,但组合框本身不会。组合框的前景色也会改变,但背景不会改变 我想,外观和感觉可能会导致这个问题 在我的主课上:Java 为什么';我的组合框不能正确更新颜色吗?,java,swing,colors,combobox,background,Java,Swing,Colors,Combobox,Background,我在我的程序中实现了一个暗模式,除了一个组合框,它不想改变我想要的颜色,其他一切都很好 如您所见,组合框的“弹出窗口”可以很好地改变颜色,但组合框本身不会。组合框的前景色也会改变,但背景不会改变 我想,外观和感觉可能会导致这个问题 在我的主课上: UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 在此处,我将更改为深色模式: TeamInterface.userFilterComboBox.setBack
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
在此处,我将更改为深色模式:
TeamInterface.userFilterComboBox.setBackground(深色背景色);
TeamInterface.userFilterComboBox.setForeground(fontColor);
SwingUtilities.updateComponentTreeUI(TeamInterface.userFilterComboBox);
我必须使用updateComponentTreeUI方法,否则“弹出窗口”也会保持白色。
如果我在我的主类中删除了look和feel,那么组合框看起来不错,正如您在这张图片中看到的
但我不想摆脱系统的外观,因此我尝试手动编辑combobox的UI以使用以下代码:
userFilterComboBox.setUI(新的metalcomboxUI());
但是。。结果太糟糕了,即使理论上(至少我是这么认为的),它看起来应该和没有外观和感觉的一样
组合框不仅仅是背景和前景的组件,而是复杂的组件。 例如:JComboBox由以下部分组成:
- 箭头按钮
- itme列表
- 边框(并且有颜色)
- 选定的项目
/**
* @contributor https://github.com/vincenzopalazzo
*/
public class PersonalComboBoxUI extends BasicComboBoxUI {
public static ComponentUI createUI (JComponent c) {
return new PersonalComboBoxUI ();
}
@Override
public void installUI (JComponent c) {
super.installUI (c);
JComboBox<?> comboBox = (JComboBox<?>) c;
comboBox.setBackground (UIManager.getColor ("ComboBox.background"));
comboBox.setForeground (UIManager.getColor ("ComboBox.foreground"));
comboBox.setBorder (UIManager.getBorder ("ComboBox.border"));
comboBox.setLightWeightPopupEnabled (true);
}
@Override
protected JButton createArrowButton () {
Icon icon = UIManager.getIcon ("ComboBox.buttonIcon");
JButton button;
if (icon != null) {
button = new JButton (icon);
}
else {
button = new BasicArrowButton (SwingConstants.SOUTH);
}
button.setOpaque (true);
button.setBackground (UIManager.getColor ("ComboBox.buttonBackground"));
button.setBorder (BorderFactory.createLineBorder(Color.black));
return button;
}
@Override
protected ListCellRenderer createRenderer() {
return new MaterialComboBoxRenderer();
}
}
ps:在本例中,我使用UIManager.put(“ComboBox.background”,COLOR)在JComponent内部进行添加和分层
因此,我想添加两个信息,关于您是否在UIManager或PersonalComboBoxUI中使用个人颜色,颜色应该用以下代码定义
Color PINK_400 = new ColorUIResource (236, 64, 122);
因为当您要删除外观时,颜色无法删除,但如果使用ColorUIResource,则应正确删除外观
最后,如果您不需要默认的外观,我建议您使用库
材质UI swing有一个系统主题,用于在应用程序中创建个人计时,并且所有主题都是个性化的
这是回购协议,是相同的存储库和相同的开发人员,因此,vincenzopalazzo/material us swing是开发人员分支,包含更多修复和测试
图书馆的一个例子是
Ps:我是材料加热系统的设计师。好人,非常感谢,它工作得很好,只是箭头按钮有点太大了()我试图在createArrowButton中编辑按钮,但如果我尝试将按钮大小设置为某个值,它似乎不起作用,知道为什么吗?我认为按钮有问题,尝试在方法内设置
Icon Icon=null
createArrowButton否不是这样,按钮总是使用新的BasicArrowButton()创建的,因为else情况被调用,所以如果在UIManager配置中不是图标,那么可以更改箭头按钮的尺寸,对于更改维度,请使用此post ps:按钮并非始终使用BasicArrowButton创建,而是使用箭头按钮创建,因为在UIManager配置中不存在JComboBox的图标。为了获得经验,我建议使用自定义图标,因为您可以更好地控制自己的行为。也许您的配置有所增加,但我的计时系统简化了这一点
Color PINK_400 = new ColorUIResource (236, 64, 122);