2012-12-19 49 views
5

我想爲計算器GUI安排兩組按鈕。每個人都使用GroupLayout來製作它們。一組是數字(和「。」),另一組用於操作按鈕。這基本上可以工作,但如果其中一個按鈕具有雙倍長度(例如我的操作集上的等號按鈕),則會拋出其他按鈕。 我將使用操作集作爲例子。有兩列和四行按鈕。最後一行只有一個按鈕 - 等於。我想在這兩列上進行雙倍的伸展。此刻,當我想讓第二列坐在它的頂部時,它簡單地將第二列推到最後。Java - 在GroupLayout中混合組件大小

下面是佈局代碼 - operLayout是操作佈局的名稱,第一行左右括號,+和 - 第二行,*和/第三行,等於最後一行。每個按鈕的最小尺寸設置在別處(它們都是相同的,除了等於兩倍)。

operLayout.setAutoCreateGaps(true); 
operLayout.setAutoCreateContainerGaps(true); 
operLayout.setVerticalGroup(operLayout 
     .createSequentialGroup() 
     .addGroup(
operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(leftBracket) 
          .addComponent(rightBracket)) 
      .addGroup(operLayout.createParallelGroup().addComponent(add).addComponent(subtract)) 
      .addGroup(operLayout.createParallelGroup().addComponent(multiply).addComponent(divide)) 
      .addGroup(operLayout.createParallelGroup().addComponent(equals))); 
    operLayout.setHorizontalGroup(operLayout 
      .createSequentialGroup() 
      .addGroup(
        operLayout.createParallelGroup().addComponent(leftBracket).addComponent(add) 
          .addComponent(multiply).addComponent(equals)) 
      .addGroup(
        operLayout.createParallelGroup().addComponent(rightBracket).addComponent(subtract) 
          .addComponent(divide))); 

我明白爲什麼會發生這種情況,但我不確定如何整理。有一個簡單的方法嗎?或者我應該改變我的做法嗎?謝謝

+0

對於您爲此任務選擇'GroupLayout',我表示讚賞。我相信這個佈局對於佈置標準表單來說是最強大的。這很容易被忽視,因爲它使用起來很複雜。在瞭解它的工作原理之後,我幾乎全部使用它。 –

+0

可以重新格式化您的代碼?目前;這是相當難以理解的。 – ArtB

+0

是的,請做,雖然有人可能擊敗了你。 謝謝@ErickRobertson,我知道你的意思,看起來很複雜,但一旦你明白了,它就非常有用! – PatrickJBC

回答

3

equals組件放在它自己的平行水平組中。

首先,確保在使用GroupLayout時使用一致的縮進。我發現這對於跟蹤發生的事情至關重要。

您看到您報告的行爲的原因是因爲等號是與第一列按鈕相同的水平並行組的一部分。所以當你把它放大兩倍時,它會將第二列按鈕向右推。這正是你告訴它要做的,因爲你告訴它留在第一個並行組(列)中。

爲了獲得您想要的行爲,您必須單獨佈置該按鈕,與其他按鈕並行佈局。你通過把它放在它自己的平行組中來做到這一點。你也許想要在這個組上進行一致,以獲得最佳行爲。我認爲GroupLayout.Alignment.CENTER是你想要的。

另請注意,如果只有一個組件,則不需要創建新組。只需添加該組件。

operLayout.setVerticalGroup(operLayout.createSequentialGroup() 
    .addGroup(operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
     .addComponent(leftBracket) 
     .addComponent(rightBracket)) 
    .addGroup(operLayout.createParallelGroup() 
     .addComponent(add) 
     .addComponent(subtract)) 
    .addGroup(operLayout.createParallelGroup() 
     .addComponent(multiply) 
     .addComponent(divide)) 
    .addComponent(equals)); 
operLayout.setHorizontalGroup(operLayout.createParallelGroup() 
    .addGroup(operLayout.createSequentialGroup() 
     .addGroup(operLayout.createParallelGroup() 
      .addComponent(leftBracket) 
      .addComponent(add) 
      .addComponent(multiply)) 
     .addGroup(operLayout.createParallelGroup() 
      .addComponent(rightBracket) 
      .addComponent(subtract) 
      .addComponent(divide))) 
    .addComponent(equals)); 
+0

感謝您的幫助! 是的,我意識到這就是我所說的,我得到的結果並沒有讓我感到驚訝,我只是不確定如何重新排列才能讓它正確。我不太明白你說的要做什麼,雖然你說它把它放在它自己的平行組(水平或垂直?我會假設是垂直的還是兩者?),但是你說如果它是一個組件,它不會' t需要一個小組。我已經嘗試了你給出的代碼,以及你使用中心對齊方式對組/組件所作的改變,但是我沒有改變。 – PatrickJBC

+0

好吧對不起剛剛意識到你說水平開始,但這樣做並不能解決問題。 – PatrickJBC

+0

我不知道爲什麼這不是爲你解決問題。確保您的縮進與您的括號對齊,以便您將組件添加到適當的組。它應該與包含水平組內兩列的順序組並行添加。這有效,所以我不確定你在做什麼不同。但是,如果基於原始代碼的組織方式出現在錯誤的地方,我不會感到驚訝。 –