2017-04-10 47 views
0

對於我製作的計算器應用程序的GUI,我有一個JButton對象的網格,其中所有對象的大小相同,除了一個是其他對象的寬度的兩倍。它應該是這個樣子(除這些線條是直的):爲什麼鏈接組件在GroupLayout中無法調整大小?

enter image description here

我首先想到的是我定義了一個大小爲JButton對象(姑且稱之爲CELL_SIZE),然後設置首選大小的按鈕到CELL_SIZE,除了較長的按鈕將有CELL_SIZE * 2。這個工作,直到你調整窗口的大小。我希望按鈕調整自己的大小,以便無論窗口的尺寸如何,所有按鈕都是相同的大小,除了較長的按鈕。所以我嘗試使用linkSize,除了長整數之外的所有按鈕都作爲參數。但按鈕不會調整大小!然後我在javadoc中讀到linkSize可以防止組件被調整大小。爲什麼是這樣?我可以使用這種方法來完成這種佈局,還是我需要別的東西?

下面是我輸入的一個類來演示問題(實際應用程序擁有除佈局以外的其他功能)它只有5個按鈕,用於表示圖像的左下角3x2區域。

import javax.swing.GroupLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

class A extends JPanel{ 

    public static final int CELL_SIZE = 32; 
    JButton b1 = new JButton("1"); 
    JButton b2 = new JButton("2"); 
    JButton b3 = new JButton("3"); 
    JButton b4 = new JButton("4"); 
    JButton b5 = new JButton("5"); 

    public A(){ 
     GroupLayout layout = new GroupLayout(this); 
     layout.setHorizontalGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup() 
       .addComponent(b1, 0, CELL_SIZE, Short.MAX_VALUE) 
       .addComponent(b2, 0, CELL_SIZE, Short.MAX_VALUE) 
      ).addGroup(layout.createParallelGroup() 
       .addGroup(layout.createSequentialGroup() 
        .addComponent(b3, 0, CELL_SIZE, Short.MAX_VALUE) 
        .addComponent(b4, 0, CELL_SIZE, Short.MAX_VALUE) 
       ) 
       .addComponent(b5, 0, CELL_SIZE * 2, Short.MAX_VALUE) 
      ) 
     ); 
     layout.setVerticalGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup() 
       .addComponent(b1, 0, CELL_SIZE, Short.MAX_VALUE) 
       .addComponent(b3, 0, CELL_SIZE, Short.MAX_VALUE) 
       .addComponent(b4, 0, CELL_SIZE, Short.MAX_VALUE) 
      ).addGroup(layout.createParallelGroup() 
       .addComponent(b2, 0, CELL_SIZE, Short.MAX_VALUE) 
       .addComponent(b5, 0, CELL_SIZE, Short.MAX_VALUE) 
      ) 
     ); 
     layout.linkSize(b1, b2, b3, b4); 
     setLayout(layout); 
    } 

    private static void createAndShowGUI(){ 
     JFrame f = new JFrame("GroupLayout Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new A()); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run(){ 
       createAndShowGUI(); 
      } 
     }); 
    } 

} 

編輯:如果我打電話addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)並取出linkSize呼叫,然後按鈕尺寸變得奇怪。 b1b2變得比b3b4更寬,但不如b5那麼寬。

+0

GridBagLayout在這裏可能是一個更好的選擇,它內置了對基於網格的佈局的支持,包括像您所描述的跨多個單元的元素。 – Charlie

回答

1

從甲骨文tutorial

1)強制的組分是可調整大小(允許收縮和生長):

group.addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ... 

這允許零大小(最小)之間以調整到任何尺寸的部件(Short.MAX_VALUE作爲最大值意味着「無限」)。如果我們希望組件不縮小到默認的最小尺寸以下,我們將在第二個參數中使用GroupLayout.DEFAULT_SIZE而不是0。

2)爲了使組件固定大小(抑制調整):

group.addComponent(component, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, 
      GroupLayout.PREFERRED_SIZE) ... 

我認爲你應該使用第一個選項。

+0

如果我這樣做,那麼組件不會正確調整大小。 'b1'和'b2'比'b3'和'b4'寬,但不如'b5'寬。 –

相關問題