2012-02-25 49 views
2

你好我的工作我的項目我的基於Swing GUI的一部分,我需要定義的setBounds Jframe的方法用的setResizable呼叫同步,所以我這樣做:搖擺的setResizable和的setBounds

setResizable(true); 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    Rectangle rect = new Rectangle(screenSize.width/2 - screenSize.width/4, screenSize.height/2 - screenSize.height/4, screenSize.width/2, screenSize.height/2); 
    setBounds(rect); 
    setResizable(false); 

但結果是,我的框架沒有得到給定的邊界,它只是禁用調整大小功能。如果我刪除最後一次setResizable調用,那麼表單將會得到正確的界限。其實我有一個基於框架和許多面板的嚮導,我改變框架上的面板就像狀態一樣。只有在一個小組中,我想給用戶機會調整框架的大小,否則它應該是固定的大小。所以在我的主框架我實現了兩個方法,enableWizardMode和enablePlayingGameMode:

@Override 
    public void enablePlayingGameMode() { 
setResizable(true); 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     setBounds(new Rectangle(screenSize.width/10, screenSize.height/10, screenSize.width - screenSize.width/5, screenSize.height- screenSize.height/5)); 
    } 

    @Override 
    public void enableWizardMode() { 
setResizable(true); 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     setBounds(new Rectangle(screenSize.width/2 - screenSize.width/4, screenSize.height/2 - screenSize.height/4, screenSize.width/2, screenSize.height/2)); 
setResizable(false); 
    } 

我與IComponentListener嘗試,但它並不能幫助我,這我調整框架隨機。 另外我嘗試使用SwingUtilities.invokeLater將可調整大小的標誌設置爲false,但它也無濟於事。 有誰知道這個問題的解決方案?我運行Linux和oracle jdk7。 謝謝。

回答

6

設置preferredSize以及調用pack()一直對我很好。

import java.awt.Dimension; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 

import javax.swing.JFrame; 

public class SizeFoo { 

    public static void main(String[] args) { 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     Rectangle rect = new Rectangle(screenSize.width/2 - screenSize.width 
      /4, screenSize.height/2 - screenSize.height/4, 
      screenSize.width/2, screenSize.height/2); 
     System.out.println("rect: " + rect); 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(rect.width, rect.height)); 
     frame.setResizable(false); 
     frame.pack(); 
     frame.setLocation(rect.x, rect.y); 
     //frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     System.out.println("JFrame size:" + frame.getSize()); 
    } 
} 
+0

它不適合我。我只是試了一下。其實我有一個基於框架和許多面板的嚮導,我改變框架上的面板就像狀態一樣。只有在一個小組中,我想給用戶調整框架的機會,否則它不應該調整大小。 – AlexTheo 2012-02-25 13:03:21

+0

@AlexTheo:那麼你需要更新你的問題,並提供所有相關的信息,包括這個和更多的細節。考慮創建和發佈[sscce](http://sscce.org),就像我的帖子一樣,它會讓我們看到你自己的問題,並允許我們修改和測試工作代碼。 – 2012-02-25 13:05:33

+0

好的,就這樣做了。 – AlexTheo 2012-02-25 13:12:44

3

如所建議的通過@Hovercraft和here示出並討論here,你應該pack()你的包圍Window,依靠各組分的優選大小。可能發生的情況是,您的項目包含一個不包含其他組件並且沒有固有的首選大小的顯示面板。在這種情況下,請覆蓋getPreferredSize()並返回一個Dimension,以反映您問題中指示的屏幕分數。