2012-02-08 57 views
2

我的問題是我怎麼可以指定我的佈局零件的大小?
我需要某種方式的集大小「部分」不使用preferedSize,也許在佈局管理器,哪裏並不重要 - 只有我需要的是穩定的大小。佈局中的Java Swing指定大小

我想爲遊戲打造的佈局。我已經創建了一個,但是我正在處理組件大小的問題。所以我認爲最好能更好地理解我的佈局。
讓我們看看我的草稿。

 

+-----------+ 
| UPPER  | 
+-----+-----+ 
| A |  | 
+-----+ C | 
| B |  | 
+-----+-----+ 
| Footer | 
+-----------+ 

A+B+C make together Center. 

主要部分由這棵樹部分組成:
大寫會出現菜單。
中心 - 這個由3個部分組成A,B,C
頁腳 - 將有狀態欄


我的想法是可以設置每個組件的大小。 所有佈局都取決於C部分,它可能有450x450像素或600x600像素大小。
對於A部分和B部分,我只需要指定寬度,因爲只有一些文本信息 - 它應該是大約300像素。
我嘗試使用GridBagLayout作爲中心部分,但setSize for C未能正常工作。
我在Containers(java.awt.Container)中創建零件 - 在它們中添加每個零件的內容,然後將Container添加到上一級。

+1

你不應該設置組件的尺寸的默認首選尺寸。組件應該知道它們的首選大小,並在調用getPreferredSize()時返回它。大多數佈局使用組件的首選大小來相應地佈置它們。 – 2012-02-08 13:18:50

+0

好的,我發現它是佈局管理器的工作......我不想設置組件的優先大小。我可以在佈局管理器(經理)中嚴格設置組件的大小嗎? – user1097772 2012-02-08 13:23:18

+0

您不能手動設置控件的大小,除非您完全不使用佈局管理器,並手動執行* all *。恐怕沒有中間道路。 – 2012-02-08 13:39:00

回答

-2

我希望我的回答可以幫助你以某種方式。從設置的JPanel或JFrame的大小經驗,我一直用setPreferredSize(new Dimension(WIDTH,HEIGHT));

+2

-1用於建議零布局。 – mre 2012-02-08 13:27:16

+0

不要誤解我的意思,使用null佈局是不好的做法;但是當然,作爲最後的選擇,當你在決定使用最好的佈局管理器時遇到麻煩,而且他們中的任何一個似乎都無法做到你想做的事情? – AWb 2012-02-08 13:34:11

+2

空佈局永遠不會是答案。 – mre 2012-02-08 13:37:26

2

最簡單的方法:使用BorderLayout的有關contentPane(已經是) - 上面板進入北 - 頁腳面板去南 - 組A和B進入一個小組AB與網格佈局(2,1) - 面板AB和C進入與GridLayout的一個小組ABC(1,2) - 面板ABC進入中心 而setPrefferedSize()的A的,B ,C

+0

Sry,但這不是我的問題的答案...如何設置零件的大小。 – user1097772 2012-02-08 13:32:45

+0

設置'C'組件的首選大小是所有需要的(除了xyz的總體策略)創建一個邏輯大小的GUI。如果您想「稍微填充」一下,請在需要的地方添加邊框。我打算創建一個基本上遵循xyz概述的公式的GUI,直到a)我看到它已經被說過了,並且b)你聲稱這不是所需要的! – 2012-02-08 13:47:12

+0

我dissagree,因爲這個原因這個事業是ab'的'大小(RESP寬度,heignt也是一樣的,但它不是問題)將同C'的'大小。 (在ab上設置優先大小也不起作用..)。 – user1097772 2012-02-08 14:17:14

2

一般情況下,的GridBagLayout忽略你與setSize控制設置的值,而不是它要求控制其首選大小(通過調用getPreferredSize)並將其用於計算總體佈局。不推薦簡單地設置首選大小,因爲大多數控件傾向於在觸發佈局時重新計算這些值,因此您很難讓它們「粘住」。

如果你真的想確保UI元素C具有一定的規模,實現它作爲一個自定義的類從適當的鹼衍生(JPanel的,例如)和覆蓋getPreferredSize方法,使其返回大小你想/需要你的用戶界面的那部分。

編輯:下面是其可以包含另一個UI元素,並且可以設置爲固定大小(使用setSize方法,該方法已被覆蓋),這應該由佈局管理器被推崇的包裝一點例如:

import java.awt.BorderLayout; 
import java.awt.Dimension; 

import javax.swing.JComponent; 
import javax.swing.JPanel; 

public class FixedSizeComponent extends JPanel { 
    private Dimension size; 
    private final JComponent content; 

    public FixedSizeComponent(JComponent content) { 
     super(new BorderLayout()); 
     this.content = content; 
     super.add(content, BorderLayout.CENTER); 
    } 

    @Override 
    public void setSize(Dimension d) { 
     size = d; 
    } 

    @Override 
    public void setSize(int width, int height) { 
     size = new Dimension(width, height); 
    } 

    @Override 
    public Dimension getSize() { 
     if (size != null) return size; 
     return content.getSize(); 
    } 

    @Override 
    public Dimension getSize(Dimension rv) { 
     if (size != null) { 
      if (rv == null) rv = new Dimension(); 
      rv.height = size.height; 
      rv.width = size.width; 
      return rv; 
     } 
     return content.getSize(rv); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (size != null) return size; 
     return content.getPreferredSize(); 
    } 

    @Override 
    public Dimension getMaximumSize() { 
     if (size != null) return size; 
     return content.getMaximumSize(); 
    } 

    @Override 
    public Dimension getMinimumSize() { 
     if (size != null) return size; 
     return content.getMinimumSize(); 
    } 
} 
+0

哦,並且使它*真的,真的*當然,最好覆蓋'getMaximumSize'和'getMinimumSize'方法... – 2012-02-08 13:41:00

+0

*「如果你真的想確保UI元素C有一定的大小,..重寫getPreferredSize「*某些佈局管理器不會考慮首選大小。我從來沒有理解重寫'setPreferredSize()'的優點,當你可以簡單地從構造函數調用它,並讓開發者選擇* default *首選大小是否是他們想要的大小。 – 2012-02-08 13:49:52

+0

根據我的經驗,只要有任何操作使當前佈局無效,就會重新計算控件的首選大小,因此如果您在構建UI時只設置了一次,則重新計算會導致手動設置的首選大小被覆蓋,排列布局被破壞。 – 2012-02-08 13:58:56

1

我有類似的問題,在用包含許多其它組分的底部上的狀態的工具欄。我的問題是它會變得更高。所以我所做的就是覆蓋最大尺寸,將最大高度設置爲最小高度。

JPanel status = new JPanel(new SpringLayout()) { 
    @Override 
    public Dimension getMaximumSize() { 
    Dimension max = super.getMaximumSize(); 
    Dimension min = getMinimumSize(); 
    return new Dimension(max.width, min.height); 
    } 
}; 
0

這個答案是太少,太晚,

(也許這個方法並沒有在問這個問題的時候存在)

就像getPreferredSize,還有一個setPreferredSize方法需要一個Dimension對象。

默認情況下,你的佈局會忽略你的組件尺寸(你可能已經使用setSize設置),而是將使用的首選尺寸。

使用setPreferredSize,你將能夠覆蓋組件