Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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外观和主要功能_Java_Look And Feel - Fatal编程技术网

java外观和主要功能

java外观和主要功能,java,look-and-feel,Java,Look And Feel,如果我在点击按钮后在actionPerfomed中使用java外观,则效果更改不会正常工作,相反,它只是稍微更改 然而,如果我把相同的代码放在main上,它就会正常工作 这个问题的解决方案是什么?当您在布局gui之前更改外观时,所有gui组件都知道如何绘制它们自己。如果在稍后阶段更改,则需要更新UI树,使更改传播到所有组件: UIManager.setLookAndFeel(lnfName); SwingUtilities.updateComponentTreeUI(frame); frame.

如果我在点击按钮后在actionPerfomed中使用java外观,则效果更改不会正常工作,相反,它只是稍微更改

然而,如果我把相同的代码放在main上,它就会正常工作


这个问题的解决方案是什么?

当您在布局gui之前更改外观时,所有gui组件都知道如何绘制它们自己。如果在稍后阶段更改,则需要更新UI树,使更改传播到所有组件:

UIManager.setLookAndFeel(lnfName);
SwingUtilities.updateComponentTreeUI(frame);
frame.pack();
关于这一点,请参阅

这是一个简单的示例,可在按下按钮时更改外观:

public static void main(String[] args) {

    final JFrame frame = new JFrame("Test");

    frame.add(new JButton(new AbstractAction("Press to change") {

        int current = 0;

        @Override
        public void actionPerformed(ActionEvent e) {

            LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels();
            LookAndFeelInfo laf = lafs[current++ % lafs.length];

            try {
                UIManager.setLookAndFeel(laf.getClassName());
                SwingUtilities.updateComponentTreeUI(frame);
                frame.pack();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
}
如果你不想
pack
frame(更改大小),只需调用
repaint

更改外观(顺便说一句,如何更改)会影响[新创建的JFrames]()