Java Metal Look&最大化时感觉隐藏Windows工具栏

时间:2012-10-17 14:53:35

标签: java swing jframe look-and-feel uimanager

在我的应用程序中,我们使用CrossPlatform L& F(金属),我们想要启动最大化的主JFrame。执行时我发现隐藏了Windows工具栏。如果我使用System L& F。

,则不会发生这种情况

为什么会这样?有什么方法可以避免这种情况吗?

强制金属L& F的代码摘录是:

    try {
        UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        MetalLookAndFeel.setCurrentTheme(new OceanTheme());
        UIManager.setLookAndFeel(new MetalLookAndFeel());
    } catch (ClassNotFoundException ex) {
        code to catch this exception;
    } catch (InstantiationException ex) {
           code to catch this exception;
    } catch (IllegalAccessException ex) {
           code to catch this exception;
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
           code to catch this exception;
    }

    JFrame.setDefaultLookAndFeelDecorated(Boolean.TRUE); 

最大化窗口的方法如下:

 private void formWindowOpened(java.awt.event.WindowEvent evt) {  
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    return;
}    

非常感谢提前

1 个答案:

答案 0 :(得分:2)

当您致电时,这似乎是一个已知问题:

JFrame.setDefaultLookAndFeelDecorated(Boolean.TRUE);

请参阅此链接:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4737788

它还通过子类化JFrame并返回适当的最大边界来显示变通方法。以下是此解决方法的演示代码:

import java.awt.Frame;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.metal.OceanTheme;

public class TestJFrame {

    private void initUI() {
        final JFrame frame = new JFrame(TestJFrame.class.getSimpleName()) {
            private Rectangle maxBounds;

            @Override
            public Rectangle getMaximizedBounds() {
                return maxBounds;
            }

            @Override
            public synchronized void setMaximizedBounds(Rectangle maxBounds) {
                this.maxBounds = maxBounds;
                super.setMaximizedBounds(maxBounds);
            }

            @Override
            public synchronized void setExtendedState(int state) {
                if (maxBounds == null && (state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
                    Insets screenInsets = getToolkit().getScreenInsets(getGraphicsConfiguration());
                    Rectangle screenSize = getGraphicsConfiguration().getBounds();
                    Rectangle maxBounds = new Rectangle(screenInsets.left + screenSize.x, screenInsets.top + screenSize.y, screenSize.x
                            + screenSize.width - screenInsets.right - screenInsets.left, screenSize.y + screenSize.height
                            - screenInsets.bottom - screenInsets.top);
                    super.setMaximizedBounds(maxBounds);
                }

                super.setExtendedState(state);
            }
        };
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
            }
        });
        JLabel label = new JLabel("some label in the middle");
        label.setHorizontalAlignment(JLabel.CENTER);
        frame.add(label);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
            MetalLookAndFeel.setCurrentTheme(new OceanTheme());
            UIManager.setLookAndFeel(new MetalLookAndFeel());
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        JFrame.setDefaultLookAndFeelDecorated(Boolean.TRUE);
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestJFrame().initUI();
            }
        });
    }

}

或者,不要致电JFrame.setDefaultLookAndFeelDecorated(Boolean.TRUE);