2013-02-14 56 views
5

本來(見我剛纔的問題「Java how to make JFrames start off as a maximised window」),我想讓它開出最大化的窗口。 此代碼實現這一點:的Java如何使最大化JFrames但不改變大小

public static void main(String[] args) { 

JFrame frame = new JFrame(); 
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setVisible(true); 

} 

但是,如果恢復下來這個窗口就變成了實際上不存在吧。爲了解決這個問題,我使用setSize()爲窗口設置了一個大小。這有效,但存在另一個問題,窗口仍然可以調整大小。

爲了解決這個問題,我設置了setResizable(false);這是我的代碼到目前爲止:

public static void main(String[] args) { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    JFrame frame = new JFrame("Jedia"); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setSize(screenSize); 
    frame.setResizable(false); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

但是,現在窗口開始在其指定的大小(而不是最大化),並且不能恢復。

所以,我的問題是,我怎麼可以使窗口開始了最大化,給它一個大小,當它恢復下來,並調整其大小是不可能的?或者製作一個最大化並且不能恢復的窗口?

回答

3

有一個簡單的修復,工程幾乎所有的時間:使你的框架不會改變大小將其具有可見。因此,只有改變你的代碼是這樣的:

public static void main(String[] args) { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    JFrame frame = new JFrame("Jedia"); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setSize(screenSize); 
    frame.setVisible(true); // FIRST visible = true 
    frame.setResizable(false); // THEN resizable = false 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

這樣,框架將啓動最大化和最大化按鈕將變爲灰色,防止用戶使用它。 (我真的不知道爲什麼你必須這樣做,我認爲最大化的狀態只有在窗口變得可見時才真正應用,如果你以前不使用它,它將不適用。)

它的工作原理幾乎所有的時候都是,因爲在Windows 7上至少可以通過單擊標題欄並拖動它使窗口退出最大化狀態。但它會達到你之前設置的大小。問題是你的用戶將無法再次最大化它,並且我還沒有找到讓聽衆使窗口回到最大化狀態的方式。 (編輯:@大衛Kroukamp顯示了他的回答的最後一部分,它是可以通過使用的ComponentListener給力的最大化狀態。因此你不必使用setResizable(false)這樣你仍然有一個問題與Windows 7,因爲拖動動作不受此事件無論出於何種原因,但用戶將能夠使用最大化按鈕,把它放回原處應該是逮住。)

現在,幾乎從來沒有一個理由去做這種東西的。當你阻止他們操縱他們的窗口時,用戶並不喜歡(例如,最大化的窗口不能被移動,當你有多個屏幕時,這可能會令人討厭)。一個例外是如果你正在製作一個遊戲,通常是全屏。但是你不會想要一個JFrame,因爲你不需要所有的裝飾,而是一個Window。

如果您的問題是默認窗口大小非常小,這是正常的。你必須先在你的框架中放置一些東西(一些控件,按鈕,你想在你的應用中使用的東西),使用佈局(這很重要),然後在你的框架上調用方法pack()。它會爲你的窗口選擇一個很好的默認大小。

終於,最後一個字。我已經將示例代碼放在main方法中作爲快捷方式,但您應該始終使用SwingUtils.invokeLater()在Swing EDT中執行Swing操作。

+1

非常感謝!這工作。說實話,我只是剛剛開始賺錢,所以我真的很想做到這一點,而不是將它應用於任何事情!再次感謝! – 2013-02-14 21:43:28

0

你在哪個環境上運行?我在Win7下使用JDK1.6/JDK1.7嘗試了這種方式,並且它按預期工作(窗口開始最大化,最小化到任務欄)。

+0

我正在談論中間的按鈕,「恢復」。與最小化無關。運行沒有setResizable的代碼,你會看到我希望它開始。 – 2013-02-14 19:48:48

1

有時,您必須小心您設置JFrame參數的順序。

此外,您應該在事件分派線程上使用Swing組件。

試試看看是否有幫助。

public static void main(String[] args) {   
    final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame frame = new JFrame("Jedia"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(screenSize); 
      frame.setResizable(false); 
      frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
      frame.setVisible(true); 
     } 
    }); 
} 
+0

不是那個窗口沒有被最大化。它仍然可以被拖動並且恢復按鈕不可用。不管怎麼說,還是要謝謝你。 – 2013-02-14 19:55:27

0

我對你有一種黑客可能有效。 試試這個代碼(它的工作對我來說):

public static void main(String[] args) { 

    final JFrame frame = new JFrame("Jedia"); 
    frame.setMinimumSize(new Dimension(600, 400)); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setVisible(true); 

    frame.addComponentListener(new ComponentListener(){ 

     @Override 
     public void componentHidden(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void componentMoved(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void componentResized(ComponentEvent e) { 

      if (!e.paramString().startsWith("COMPONENT_RESIZED (-8,-8")) 
      frame.setSize(new Dimension(600, 400)); 
     } 

     @Override 
     public void componentShown(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 
    }); 
} 

e.paramString()返回一個字符串,看起來像 「COMPONENT_RESIZED(-8,-8,[屏幕尺寸])」,當恢復動作發生。