2012-07-13 21 views
1

我注意到在boxlayout中設置最大大小時有些奇怪。setMaximumSize對排列在boxlayout中的JPanel的影響

我需要一列沿着窗口右側的面板,我試着用一個盒子佈局來設置它。可能會有8-10個,也可能有30-40個,所以我給他們足夠的空間來解釋30-40,但是如果只有8-10個,他們就會佔用所有可用空間,而且看起來很奇怪。所以我想我會設置他們的最大大小來阻止它的發生......

......我一直在結束大部分消失。所以我把它分解成一個非常基本的彩色面板堆棧,試圖看看發生了什麼,我已經想出瞭如何繼續,但我不喜歡它。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class BoxLayoutDemo extends JFrame { 


    public BoxLayoutDemo() { 
    super("JScrollPane Demonstration"); 
    setSize(800, 600); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    init(); 
    setVisible(true); 
    } 

    public void init() { 
    setLayout(null); 

    JPanel rightPanel = new JPanel(); 
    rightPanel.setBounds(400,0,400,600); 
    rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS)); 

    JPanel greenPanel = new JPanel(); 
    JPanel bluePanel = new JPanel(); 
    JPanel yellowPanel = new JPanel(); 
    greenPanel.setBackground(Color.GREEN); 
    bluePanel.setBackground(Color.BLUE); 
    yellowPanel.setBackground(Color.YELLOW); 

    rightPanel.add(greenPanel); 
    rightPanel.add(bluePanel); 
    rightPanel.add(yellowPanel); 

    add(rightPanel); 



    } 

    public static void main(String args[]) { 
    new BoxLayoutDemo(); 
    } 
} 

......這就是你所期望的:三個彩色的盒子佔據了屏幕的右半部分。

如果我添加類似:

greenPanel.setMaximumSize(new Dimension(400,100)); 
bluePanel.setMaximumSize(new Dimension(400,100)); 
yellowPanel.setMaximumSize(new Dimension(400,100)); 

然後,而不是三個彩色框均只有100像素高,只佔用上半左右的屏幕,這也是我所期待什麼。

但如果我這樣做...

greenPanel.setMaximumSize(new Dimension(400,100)); 
yellowPanel.setMaximumSize(new Dimension(400,100)); 

藍色面板都擊碎其他兩個下降到只有幾個像素高大。

這可能不會是一個問題,我可以爲所有事情設置最大尺寸,但在假設情況下,這不是真的可行,是否有方法來改變這種行爲,或者是這樣盒子的佈局是什麼?

編輯:

好了,我們會打電話給test1的是:

greenPanel.setMinimumSize(new Dimension(400,100)); 
yellowPanel.setMinimumSize(new Dimension(400,100)); 

...因爲綠色和黃色面板大約200像素高反正這對任何事情沒有影響。

測試2:

greenPanel.setMaximumSize(new Dimension(400,100)); 
yellowPanel.setMaximumSize(new Dimension(400,100)); 

...使得藍光面板擠掉最初描述的綠色和黃色的。

TEST3:

greenPanel.setMinimumSize(new Dimension(400,100)); 
greenPanel.setMaximumSize(new Dimension(400,100)); 
yellowPanel.setMinimumSize(new Dimension(400,100)); 
yellowPanel.setMaximumSize(new Dimension(400,100)); 

...應該導致綠色和黃色板是100像素高,因爲你在實踐中所描述的,不同的是實際發生的事情是完全一樣的東西在TEST2。

+0

不硬編碼的大小,永遠。從來沒有想過一個空佈局,也沒有干擾組件的大小提示(http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi/7229519# 7229519)。選擇一個滿足您需求的LayoutManager並允許微調f.i. MigLayout(或者如果你被困在核心管理器,GridBagLayout中)。 – kleopatra 2012-07-14 08:42:19

+0

是啊,是Java俱樂部的第一條規則。除非佈局管理者不會真正地使視覺材料的尺寸標定得很好,除非我採取額外的措施,否則無論如何都會使用空佈局。我對宗教對編程公約的態度不感興趣。 – user1299656 2012-07-14 17:16:42

+0

聳聳肩,它是_your_你在浪費堅持做錯事情的時間... – kleopatra 2012-07-15 08:35:50

回答

0

問題是,bluePane的默認最大尺寸現在是32767x32767 ...

的佈局管理器基本上去,並試圖提供的最大空間量所能,藍色(默認的最小尺寸似乎是10×10我的電腦上(因此是默認的首選大小))

相反,如果使用setMaximumSize的,我改變你的代碼使用的minimumSize

greenPanel.setMinimumSize(new Dimension(400,100)); 
yellowPanel.setMinimumSize(new Dimension(400,100)); 

我可以得到想要的結果,這是因爲佈局管理器無法再爲其分配更多的空間來藍窗格。

UPDATE

然後我失去了一些東西。

如果我使用您的默認代碼,我會正常放置所有三個面板。 如果我只用綠色&黃色(最大尺寸),那麼它們會爲你描述 如果我設置了綠色&黃分鐘大小壓扁,我得到的三塊板設置了正常

下面是我使用的代碼。

public void init() { 

    setLayout(null); 

    JPanel rightPanel = new JPanel(); 
    rightPanel.setBounds(400,0,400,600); 
    rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS)); 

    JPanel greenPanel = new JPanel(); 
    JPanel bluePanel = new JPanel(); 
    JPanel yellowPanel = new JPanel(); 

     Dimension size = new Dimension(400, 100); 

     // Default 
    // greenPanel.setMaximumSize(size); 
    // bluePanel.setMaximumSize(size); 
    // yellowPanel.setMaximumSize(size); 

     // Test 1 
    // greenPanel.setMaximumSize(size); 
    // yellowPanel.setMaximumSize(size); 

     // Test 2 
     greenPanel.setMinimumSize(size); 
     yellowPanel.setMinimumSize(size); 

    greenPanel.setBackground(Color.GREEN); 
    bluePanel.setBackground(Color.BLUE); 
    yellowPanel.setBackground(Color.YELLOW); 

    rightPanel.add(greenPanel); 
    rightPanel.add(bluePanel); 
    rightPanel.add(yellowPanel); 

    add(rightPanel); 

    } 

您的默認

Your default setup

綠色&黃最多隻有(藍色默認大小)

Test 1 - Green & Yellow Max only

綠色&黃民只有(藍色默認大小)

Test 2 - Green & Yellow Min only

現在認真思考一下發生了什麼。

在默認測試下,佈局管理器已經確定它可以按比例佈置所有面板(因爲高度相同)。它必須這樣做,因爲最大尺寸已被設置爲&它有空間這樣做。事實上,如果我沒有設置任何大小(全部爲默認值),它們以這種方式排列

在測試1下,決定藍色窗格需要按比例增加空間,然後是綠色和黃色(藍色MAX高度= 32767,綠&黃色MAX高度爲100),因此它squishes下來(綠色&黃化分鐘高度是10個像素)

在試驗2中,它決定,藍色面板應該接收最大量的的大小(因爲它的MAX大小是32767,但是最小和最小尺寸是10),但它也被發現綠色和黃色窗格不能小於100像素,因此它將剩餘空間分配給藍色(在這種情況下約爲100像素)。

更新2

好了,這就是我的工作了:P。基本上,僅使用最小值或僅使用最大值的差異會降低到這些大小的默認大小(min/max/pref)。

當您僅使用最小值時,組合最大高度爲98301(每個組件最大爲32767)。這需要在組件之間進行劃分。佈局使用一種保理方法(根據需要爲所有組件提供空間的百分比)。爲此,它使用max和pref大小的組合。

當我只使用最小尺寸,綠色和黃色的地方實際上被分配200像素 - 這降低到最大尺寸值。只使用最大尺寸,綠色和黃色分配了11個像素(因爲藍色獲得了獅子份額)。

...所以是的,最小尺寸被忽略...在這種情況下。

如果分配的空間量(600)大於等於全部首選空間(30),則佈局管理器使用此路徑。如果分配的空間(600)是<總的首選空間,則佈局管理器將使用預製/分大小的組合來計算因子...

該文檔實際上說佈局管理器可能忽略一個或多個這些(最大值/最小值/最小值)值,因爲它們只是一條指導線。

但是,如果使用pref大小代替,藍色和綠色分配229像素(藍色只能獲得140)。

在這種情況下,我會使用最大&預設尺寸的組合或使用類似GridBagLayout的東西。

我沒有使用它,但很多人都是靠MigLayout發誓的。

乾草,感謝您的一個有趣的問題;)

+0

即使這樣做,這將是一個不太理想的解決方案,但它不起作用。設置綠色和黃色的最小值會產生完全相同的結果,因爲根本不會設置任何大小,因爲它們比這更大。如果我將綠色和黃色的最小值和最大值都設置爲400,100,但不對藍色進行任何操作,那麼我會得到與以前相同的結果。藍色面板擠出其他兩個,其最小尺寸顯然被忽略。 – user1299656 2012-07-14 17:34:44

+0

請參閱編輯,評論中沒有任何段落結構使閱讀變得困難。 – user1299656 2012-07-14 22:58:27

+0

歡呼一些更多的信息去 – MadProgrammer 2012-07-15 09:31:22