我在程序中实现了暗模式,除了Combobox之外,其他一切都正常运行,Combobox不想根据需要更改其颜色。
因此,如您所见,组合框的“弹出窗口”将颜色更改得很好,但组合框本身却没有。组合框的前景颜色也会更改,但背景不会更改。
我想,外观可能会引起问题。
在我的主要班级:
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
在我更改为暗模式的地方:
TeamInterface.userFilterComboBox.setBackground( darkBackgroundColor );
TeamInterface.userFilterComboBox.setForeground( fontColor );
SwingUtilities.updateComponentTreeUI( TeamInterface.userFilterComboBox );
我必须使用updateComponentTreeUI-Method,因为否则“弹出窗口”也将保持白色。 如果我删除主类的外观,则该组合框看起来不错,如您在此图片中所见,
但是我不想摆脱系统的外观,因此我尝试使用以下代码手动将组合框的用户界面编辑为金属:
userFilterComboBox.setUI( new MetalComboBoxUI() );
但是..结果太糟糕了,即使从理论上讲(我认为也是这样),它看起来和没有外观的感觉一样
答案 0 :(得分:0)
组合框不仅是背景和前景的组件,而且是复杂的组件。 一个例子:JComboBox组成为:
要进行更改,您可以在UIManager中添加所有常量,也可以添加所有常量,也可以定义新的UIComponent。
因此 PersonalComboBoxUI 可以执行以下操作:
/**
* @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();
}
}
还应该定义PersonalComboBoxRenderer
/**
* @contributor https://github.com/vincenzopalazzo
*/
public class PersonalComboBoxRenderer extends BasicComboBoxRenderer {
@Override
public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JComponent component = (JComponent) super.getListCellRendererComponent (list, value, index, isSelected, cellHasFocus);
component.setBorder (BorderFactory.createEmptyBorder (5, 5, 5, 5));
component.setForeground (UIManager.getColor ("ComboBox.foreground"));
component.setBackground (isSelected || cellHasFocus ?
UIManager.getColor("ComboBox.selectedInDropDownBackground") :
UIManager.getColor("ComboBox.background"));
return component;
}
}
ps:在这种情况下,我使用UIManager.put(“ ComboBox.background”,COLOR)在JComponent内进行添加和分层。
因此,我想添加两个信息,有关您是否在UIManager或PersonalComboBoxUI中使用个人颜色,应使用此代码定义颜色
Color PINK_400 = new ColorUIResource (236, 64, 122);
因为当您删除外观时无法消除颜色,但是如果使用 ColorUIResource ,则应正确删除外观。
最后,如果您不需要默认的外观,我建议您使用一个库。
material-UI-swing 具有用于在您的应用中创建个人计时的系统主题,并且所有主题都是可个性化的。
这是仓库vincenzoapalazzo/material-ui-swing和atarw/material-ui-swing是相同的存储库,并且是相同的开发人员,因此, vincenzopalazzo / material-us-swing 是开发人员分支,包含更多修复和测试。
该库的一个示例是
。
Ps:我是 MaterialTheming System 的设计师。