4

在我的应用程序中,我们使用 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;
}    

提前谢谢了

4

1 回答 1

3

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

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

于 2012-10-17T21:14:30.043 回答