2017-04-10 46 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'宽。 –

相关问题