为什么我的组合框无法正确更新其颜色?

时间:2019-10-09 07:48:53

标签: java swing colors combobox background

我在程序中实现了暗模式,除了Combobox之外,其他一切都正常运行,Combobox不想根据需要更改其颜色。

1

因此,如您所见,组合框的“弹出窗口”将颜色更改得很好,但组合框本身却没有。组合框的前景颜色也会更改,但背景不会更改。

我想,外观可能会引起问题。

在我的主要班级:

UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );

在我更改为暗模式的地方:

TeamInterface.userFilterComboBox.setBackground( darkBackgroundColor );
TeamInterface.userFilterComboBox.setForeground( fontColor );
SwingUtilities.updateComponentTreeUI( TeamInterface.userFilterComboBox );

我必须使用updateComponentTreeUI-Method,因为否则“弹出窗口”也将保持白色。 如果我删除主类的外观,则该组合框看起来不错,如您在此图片中所见,

2

但是我不想摆脱系统的外观,因此我尝试使用以下代码手动将组合框的用户界面编辑为金属:

userFilterComboBox.setUI( new MetalComboBoxUI() );

但是..结果太糟糕了,即使从理论上讲(我认为也是这样),它看起来和没有外观的感觉一样

3

1 个答案:

答案 0 :(得分:0)

组合框不仅是背景和前景的组件,而且是复杂的组件。 一个例子:JComboBox组成为:

  • ArrowButton
  • itme列表
  • 边框(有颜色)
  • 所选项目

要进行更改,您可以在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-swingatarw/material-ui-swing是相同的存储库,并且是相同的开发人员,因此, vincenzopalazzo / material-us-swing 是开发人员分支,包含更多修复和测试。

该库的一个示例是

OcenicTheme

Ps:我是 MaterialTheming System 的设计师。