簡體   English   中英

JFrame.setExtendedState(MAXIMIZED_BOTH)是否與未修飾的框架一起使用?

[英]Does JFrame.setExtendedState(MAXIMIZED_BOTH) work with undecorated frames?

以下Swing代碼在我的計算機或我的同事計算機(所有Windows XP和Java 6)上無法正常運行:

public class Test {
    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setLayout(new FlowLayout());
        frame.add(new JButton(new AbstractAction("Maximize") {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setExtendedState((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH);
            }
        }));
        frame.setUndecorated(true);
        frame.setVisible(true);
    }
}

它最大化窗口,但不考慮窗口任務欄(它填滿屏幕)。 如果你注釋掉“frame.setUndecorated(true);” 它似乎工作正常。

Javadoc似乎暗示這應該有效。 這是Java中的錯誤嗎? 它僅限於特定版本或Windows版本嗎? 有解決方法嗎?

我看過幾個解決方法 ,但它們似乎不完整。 我不能成為第一個用Java編寫自己的框架裝飾的人。

編輯:下載OpenJDK並挖掘本機代碼后,我發現Java正在調用win32函數SetWindowPlacement,並在某些條件下更改MINMAXINFO以獲得正確的窗口大小。 我認為我看到的是沒有標題或邊框的窗口的默認窗口行為(雖然我無法在任何地方找到記錄)。 我發現調用JFrame.setMaximizedBounds()提供了用於改變win32 MINMAXINFO結構的邊界。 因此,通過改變我執行的動作並使用camickr建議的窗口大小作為我的MaximizedBounds,我會更接近:

GraphicsConfiguration graphicsConfiguration = frame.getGraphicsConfiguration();
frame.setMaximizedBounds(graphicsConfiguration.getBounds());
frame.setExtendedState((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH);

現在,最大化窗口不再隱藏菜單欄。 但是......現在我還有另外一個問題。 我不能從輔助監視器最大化。 框架剛剛消失。

我正在添加一些win32標簽,希望能夠讓一位認識到這個問題的C ++程序員。

解決方案:我顯然無法回答我自己的問題,所以我只是將我的解決方案放在這里。 我不得不使用Sun類,並且我沒有在Windows以外的任何平台上測試它,但到目前為止,這似乎適用於多個監視器和多個任務欄配置:

GraphicsConfiguration config = frame.getGraphicsConfiguration();
Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice());
frame.setMaximizedBounds(new Rectangle(0, 0, usableBounds.width, usableBounds.height));
frame.setExtendedState((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH);

有趣。 當我嘗試它似乎分兩步進行。 首先展開以填充任務欄上方的空間,然后在一瞬間它覆蓋任務欄。 我不知道為什么。

無論如何,您可以使用以下方法:

GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
Rectangle bounds = env.getMaximumWindowBounds();
System.out.println("Screen Bounds: " + bounds );

要在最大化框架時手動設置框架的邊界。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM