2013-01-04 34 views
3

所以我對GUI很新,遇到了問題,無論我將我的首選大小設置爲(通過setPreferredSize(new Dimension(width, height))),它將寬度和高度都加上10。我在想,爲什麼會發生這種情況?是的,我知道這是「首選尺寸」,但肯定有一種方法可以防止這種情況發生。我可以通過簡單地從寬度和高度中減去10,然後將其傳遞給方法來解決這個問題,但我想知道發生了什麼。什麼是壓倒我的首選尺寸? (JPanel)

我的(相關的)代碼:

主要方法:

public static void main(String[] args) 
{ 
    final App app = new App(500, 500); 

    JFrame frame = new JFrame("Block Stacker 3000"); 
    frame.getContentPane().add(app); 
    frame.pack(); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    System.out.println(app.getSize()); 
    app.start(); 
} 

應用構造(擴展JPanel):

public App(int width, int height) 
    { 
    this.width = width; 
    this.height = height; 

    System.out.println(width + " " + height); 

    setPreferredSize(new Dimension(width , height)); 

    setBackground(Color.CYAN); 
    } 

當運行時,其輸出如下:

500 500 
java.awt.Dimension[width=510,height=510] 

另外,我試過使用setMinimumSize()setMaximumSize(),但都沒有影響任何東西。

+0

不,那不行。然而,你的評論讓我亂搞了更多的代碼,並且我發現如果我用「setSize(500,500)」設置大小,那麼「setResizable(false);」最後「pack();」它似乎完美地工作,但我不知道爲什麼。它似乎沒有任何其他方式。 – user1945612

+0

爲了儘快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

謝謝,下次還會去做 – user1945612

回答

3

您的JPanel的尺寸將由佈局管理器處理其容器中的組件決定。 JFrame有一個默認的佈局管理器,所以即使你沒有設置,也有一個。一些佈局經理注意到首選大小,有些則沒有,有些則比其他人更關注最小/最大大小。你可以設置一個「空佈局管理器」,也稱爲「絕對定位」,並且自己控制所有的大小,但是我認爲你並沒有試圖這麼做(因爲你正在設置一個「首選」尺寸)。你需要做什麼來設計你的用戶界面,找出你想要的東西的相對大小和位置,以及窗口大小改變時你想要發生什麼;確定哪些佈局管理器去到和成容器板以及包含這些容器板等

而且我也不會消除frame.pack();它本質上告訴佈局管理器做它的東西,你通常所需的佈局經理來處理事情,一旦你讓他們設置你想要的方式...

2

我複製/粘貼你的代碼,並得到了以下的輸出:

500 500 
java.awt.Dimension[width=510,height=530] 

但後來,我土氣的截圖框架:

enter image description here

如果下載的圖像,並檢查文件的屬性,你會看到,它是502個像素寬度(由於窗口1的象素薄邊界)和531像素高度(由於窗口標題欄31的像素高度),在gimp中檢查圖像,我可以發現青色區域實際上是500x500像素寬。

UPDATE:frame.setVisible(true);後移動setResizable(false)句行:

JFrame frame = new JFrame("Block Stacker 3000"); 
    frame.getContentPane().add(app); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setResizable(false); 

之後,它會打印:

500 500 
java.awt.Dimension[width=500,height=500] 
+0

是的,但面板仍然是510×530,你不能看到它,因爲該框架只有500×500。當我嘗試向面板添加元素時,它們從屏幕上伸出。 – user1945612

+0

我在'frame.setVisible(true);'之後移動了'setResizable(false)'並且它工作,現在打印java.awt.Dimension [width = 500,height = 500]'。請試用 – higuaro

+0

試過了,它有效,但會產生問題。現在框架比面板大,至少對我來說。當我在調用應用程序大小之前添加'System.out.println(frame.getSize());'時。它返回java.awt.Dimension [width = 516,height = 536]'非常直觀 – user1945612

0

您必須調用setResizable(false)後打電話pack(),因爲當窗口可調整大小時,佈局管理器將爲(潛在)滾動條留下10px的邊距。

public static void main(String[] args) { 
    final App app = new App(500, 500); 

    JFrame frame = new JFrame("Block Stacker 3000"); 
    frame.getContentPane().add(app); 
    frame.setResizable(false); 
    frame.pack(); 

    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    System.out.println(app.getSize()); 
    app.start(); 
}