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列表
  • 边框(并且有颜色)
  • 选定的项目
因此,对于可以在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();
    }
}
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);