Java Swing 中的 UIManager 工作不一致? / JOptionPane 消息背景

UIManager in Java Swing not working consistently? / JOptionPane Message Background

我正在尝试在我的自定义 JOptionPane 中设置背景颜色,但无论如何,我无法让选项窗格的消息部分更改颜色。

尝试 #1 是将窗格背景设置为不透明。

尝试 #2 还循环遍历窗格的组件,并设置不透明 and/or 背景属性(如果它们是 JPanel 或 JLabel)。

这对消息部分不起作用。据我所知,JPanel 甚至不作为组件之一存在。

尝试 #3 是使用 UIManager,但这并不能始终如一地工作。

我的意思是,如果你运行这个程序5次,有时背景颜色没有改变,有时全部改变,有时部分改变。

我在 invokeLater 线程中 运行ning。

UIManager.put("OptionPane.background",Color.white);
UIManager.put("JOptionPane.background",Color.white);
UIManager.put("Panel.background",Color.white);
UIManager.put("JPanel.background",Color.white);

有什么想法吗?

您可以使用以下解决方法:

    JLabel messageLabel = new JLabel("Background is cyan!") {
        /**
         * {@inheritDoc}
         */
        @Override
        public void addNotify() {
            super.addNotify();
            if (getRootPane() != null) {
                List<Component> children = findAllChildren(getRootPane());
                for (Component comp : children) {
                    if (!(comp instanceof JButton)) {
                        comp.setBackground(Color.CYAN);
                    }
                }
            }
        }

        private List<Component> findAllChildren(Component aComp) {
            List<Component> result = new ArrayList<Component>();
            result.add(aComp);
            if (aComp instanceof Container) {
                Component[] children = ((Container) aComp).getComponents();
                for (Component c : children) {
                    result.addAll(findAllChildren(c));
                }
            }
            return result;
        }
    };
    JOptionPane.showConfirmDialog(null, messageLabel, "Test title", JOptionPane.YES_NO_CANCEL_OPTION);