2015-10-26 47 views
1

Java Swing:如何處理GridBagConstraints的許多不同的插入符?

我創建了一個方法來返回一個GridBagConstraints,以便我不需要不斷地調用新的GridBagConstraints();並設置了一堆變量。它的工作原理是這樣的:

displayPanel.add(labelPanel, createGBC(0, 0, 2); 
displayPanel.add(nosePanel, createGBC(1, 0, 3); 
displayPanel.add(mainPanel, createGBC(2, 0, 3); 

等。

而對於我createGBC代碼:

private GridBagConstraints createGBC(int x, int y, int z) { 
    gbc = new GridBagConstraints(); 
    gbc.gridx = x; 
    gbc.gridy = y; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    gbc.anchor = (x == 0) ? GridBagConstraints.EAST : GridBagConstraints.WEST; 
    if (z == 0) gbc.insets = new Insets(0, 0, 0, 0); 
    else if (z == 1) gbc.insets = new Insets(8, 0, 0, 0); 
    else if (z == 2) gbc.insets = new Insets(4, 4, 0, 4); 
    else if (z == 3) gbc.insets = new Insets(0, 2, 0, 2); 
    else if (z == 4) gbc.insets = new Insets(0, 0, 16, 0); 
    else if (z == 5) gbc.insets = new Insets(6, 0, 16, 0); 
    return gbc; 
} 

我的問題是:有沒有更好的方法來處理許多不同的插圖比單純做了很多其他的陳述?我目前的方法出現了幾個問題。

  1. 我開始失去將哪些插入物分配給哪個z值的跟蹤。 (我試圖重構,使其更具可讀性/可重用性)。

  2. 其實我可能需要添加更多的插圖預置這將加劇問題1.

+0

我認爲使用[GUI佈局工具](https://netbeans.org/features/java/swing.html)是一個更好的解決方案。我給出的這個鏈接是免費的,非常受好評的IDE,Netbeans。 – markspace

+2

你知道,你不需要每次創建一個'GridBagConstraints'的新實例,每次添加一個組件時,都會複製這些約束,這意味着你可以創建一個實例並且只改變那些改變的值和' GridBagLayout'會在每次添加組件時創建它自己的內部副本 – MadProgrammer

+0

如果它很混亂,請刪除此方法並在添加()調用之前將所有GridBagConstraints設置到位 – ControlAltDel

回答

1

當您添加組件到GridBagLayoutGridBagLayout將使約束的副本,這意味着你並不需要創建一個新的實例,你想使小的變化,例如每一次...

setLayout(new GridBagLayout()); 
GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridx = 0; 
gbc.gridy = 1; 
gbc.insets = new Insets(0, 0, 0, 0); 
add(labelPanel, gbc); 

gbc.gridx = 1; 
gbc.insets = new Insets(0, 2, 0, 2); 
add(nosePane, gbc); 
gbc.gridx = 2; 
add(mainPanel, gbc); 

這意味着你只需要改變那些你需要的屬性,並且可以繼續重用你設置的基本限制先前。

當您需要更改/重置的屬性數量變大(或者您不記得或需要更改的屬性)時,則可以創建約束的新實例。

我傾向於使用單個實例這種方式來「組」組件。

如果,你的情況,你想重新使用Insets,那麼也許你可以創建一系列的常量和使用那些,這將使你的代碼更易於閱讀和維護

+0

好吧,這是有道理的。我對swing很新,所以我不知道GridBagConstraints是什麼約定,因此導致我嘗試使用GBC方法來縮短其他方法體內的代碼。如果這很常見,那麼對每個add()來說確實容易得多。 –

+0

@EdwardGuo這很像我被證明使用它(回頭的時候),也是我見過的大多數其他開發者使用它的慣例,總是有例外,但這似乎是最常見的方式 - 我懶得做更多的事情;) – MadProgrammer

1

正如MadProgrammer提到,每次都不需要新的GridBagConstraints對象,因爲GridBagLayout會克隆每個添加組件的約束。

通常,我建議您用枚舉常量替換int值(z),並將您的Insets對象作爲值存儲在EnumMap中。但是,在你的情況下,有一個簡單的解決方案:我沒有設定的gridx,gridy,gridwidth或gridheight在所有

GridBagConstraints gbc = new GridBagConstraints(); 

gbc.anchor = GridBagConstraints.EAST; 
gbc.insets = new Insets(4, 4, 0, 4); 
displayPanel.add(labelPanel, gbc); 

gbc.anchor = GridBagConstraints.WEST; 
gbc.insets = new Insets(0, 2, 0, 2); 
displayPanel.add(nosePanel, gbc); 
displayPanel.add(mainPanel, gbc); 

通知。 gridwidth和gridheight默認爲1。 gridx和gridy的默認值爲GridBagConstraints.RELATIVE,這恰好是您想要的:它會自動將每個新組件添加到同一行,除非gridwidth或gridheight更改爲REMAINDER,在這種情況下,將分別啓動新的行或列爲下一個相對放置的組件。