2010-03-30 36 views
2

下面是代码:为什么setPreferredSize不会改变按钮的大小?

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

public class TestGrid { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(4, 9)); 
     panel.setMaximumSize(new Dimension(9*30-20,4*30)); 

     JButton btn; 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(30, 30)); 
       panel.add(btn); 
      } 

      btn = new JButton(); 
      btn.setPreferredSize(new Dimension(30, 10)); 
      panel.add(btn); 

      for (int j=1; j<=4; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(30, 30)); 
       panel.add(btn); 
      } 

     } 
     mainPanel.add(panel); 
     frame.add(mainPanel); 

     frame.setSize(450,950); 
     frame.setVisible(true); 
    } 
} 

我想有按钮的表4行9列。中间栏应该比其他栏更窄。我试过Dimension(30, 10)Dimension(30, 10)都没有影响中间列的宽度。为什么?

+2

阅读教程。您已经多次提供了Swing教程的链接。这在“如何使用网格布局”教程中有明确的说明。用这些问题退出论坛,直到你做了一些基本的阅读。现在是最近几天与布局经理有关的7个问题。令我难以置信的是,人们继续回答这些问题,特别是当你不接受答案时。 – camickr 2010-03-30 16:09:42

+1

@camickr,没有人强迫你回答我的问题。有些人有问题,有些人已经准备好回答这个问题。这些人可以找到共同的语言和合作的方式。如果你不明白它为什么起作用,那就不要参与其中。别打扰别人。 – Roman 2010-04-01 13:40:50

+1

我了解它的工作方式。你做了一些研究,当你遇到问题时,你会发问询问。我们不在这里为你做阅读。如果您付出努力,我们将努力。 – camickr 2010-04-01 15:07:04

回答

7

布局管理员可以自由地忽略首选大小。具体而言,GridLayout将始终使网格中的每个单元格的大小完全相同(出于这个原因,这是一个相当无用的布局管理器)。

您必须使用不同的布局管理器,例如嵌套的BoxLayoutGroupLayout

1

GridLayout非常不灵活,因为每个单元都具有相同的大小,通常表示添加到网格中的任何对象的最大高度和宽度设置。

如果行和/或列需要具有不同的大小,则应使用GridBagLayout。

-1

setPreferredSize将不会更改按钮的大小,直到通过使用尺寸设置尺寸。

例子: -

Dimension dim = new Dimension(20,20), then use setPerferredSize(dim).

+0

在这种情况下,设置Dimension将无济于事。正在使用GridLayout,它并未完全兑现setPreferredSize。根据最大宽度和高度,GridLayout将所有高度和宽度设置为相同。另外请注意,最大高度和宽度不一定来自同一个组件。 – Michael 2012-04-02 17:25:51

0

我发现这个方法的版本,适合完美的解决方案:

.addComponent(<>,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing中.GroupLayout.DEFAULT_SIZE,<>)

相关问题