Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing中的UIManager工作不一致?/JOptionPane消息背景_Java_Swing_Joptionpane_Uimanager - Fatal编程技术网

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

Java Swing中的UIManager工作不一致?/JOptionPane消息背景,java,swing,joptionpane,uimanager,Java,Swing,Joptionpane,Uimanager,我正在尝试在自定义JOptionPane中设置背景色,但无论如何,我都无法使选项窗格的消息部分更改颜色 尝试#1是设置窗格背景和不透明 尝试#2还循环了窗格的组件,并设置不透明和/或背景属性(如果它们是JPanel或JLabel) 这对消息部分不起作用。据我所见,JPanel甚至不作为组件之一存在 尝试#3是使用UIManager,但这并不是始终如一的 我的意思是,如果你运行这个程序5次,有时背景颜色没有改变,有时它们都改变了,有时它们中的一些也改变了 我正在调用器线程中运行 UIManager

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

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

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

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

尝试#3是使用UIManager,但这并不是始终如一的

我的意思是,如果你运行这个程序5次,有时背景颜色没有改变,有时它们都改变了,有时它们中的一些也改变了

我正在调用器线程中运行

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);
JLabel messageLabel=new JLabel(“背景为青色!”){
/**
*{@inheritardoc}
*/
@凌驾
public void addNotify(){
super.addNotify();
如果(getRootPane()!=null){
List children=findAllChildren(getRootPane());
用于(组件组件:子组件){
if(!(JButton的comp实例)){
公司背景(青色);
}
}
}
}
私有列表findAllChildren(组件aComp){
列表结果=新建ArrayList();
结果:添加(aComp);
if(容器的aComp实例){
组件[]子组件=((容器)aComp).getComponents();
用于(c部分:儿童){
结果:addAll(findAllChildren(c));
}
}
返回结果;
}
};
showConfirmDialog(null,messageLabel,“测试标题”,JOptionPane.YES\u NO\u CANCEL\u选项);
Post寻求帮助。“有什么想法吗?”请改用
JDialog
。说真的,
JOptionPane
是一个方便的小实用程序类,但一旦涉及到定制它,它就是一场噩梦。