Java Swing中的UIManager不能始终如一地工作? / JOptionPane消息背景

时间:2015-05-18 08:35:00

标签: java swing joptionpane uimanager

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

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

尝试#2也是遍历窗格的组件,如果它们是JPanel或JLabel,则设置不透明和/或背景属性。

这对消息部分不起作用。从我所看到的,JPanel甚至不作为其中一个组件存在。

尝试#3是使用UIManager,但是这不能保持一致。

我的意思是,如果您要运行程序5次,有时候没有更改背景颜色,有时它们都会被更改,有时会更改其中一些。

我在invokeLater线程内运行。

boost::none

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

    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);