带有固定宽度和高度的GridLayout?

3

我有一个主面板,我会在其中动态添加组件。

主面板采用了GridLayout布局,限制为3列和0行(0行将允许行无限增长),但问题是我希望所有组件都具有固定大小或组件的首选大小。

如果其他布局符合我的要求,我可以使用其他布局...但目前只有GridLayout可以将列限制为3...

我忘了提到,主面板添加到了JScrollpane中,所以我可以垂直滚动。


如果符合我的要求,我可以使用其他布局...是的,这就是你需要做的。GridLayout 总是会调整组件大小。尝试使用 GridBagLayout。 - camickr
很难根据您的描述判断,但我建议使用类似于GridBagLayout或者FlowLayout这样的布局管理器。当配置正确时,它们都会尽量按照组件的首选大小来进行布局,如果有足够的空间的话。 - MadProgrammer
@camickr 如何将GridBagLayout限制为3列? - jovanMeshkov
@MadProgrammer 如何将FlowLayout限制为3列? - jovanMeshkov
@JovanMeshkov 您必须自己完成此操作。如果您添加了超过3个组件,GridLayout将会溢出到另一行... - MadProgrammer
虽然并没有给我太多帮助,但你让我不得不更多地尝试使用FlowLayout。因此,使用FlowLayout和通过setPreferredSize()动态调整主面板的高度,问题得以解决! - jovanMeshkov
1个回答

2

一种方法是使用JPanels。GridLayout会拉伸您的组件,但如果将组件包装在JPanel中,则JPanel会被拉伸。由于JPanel使用FlowLayout,它不会拉伸组件,因此您的组件保持其首选大小。

这里有一个使用JButton的示例。请注意,我在每个循环中将它们添加到(新的)JPanel中,然后将面板添加到网格布局中。

  import javax.swing.*;

  public class GridLayout {
     public static void main( String[] args ) {
        SwingUtilities.invokeLater( new Runnable() {
           public void run() {

              JFrame frame = new JFrame();

              frame.setLayout( new java.awt.GridLayout( 0, 3 ) );
              for( int i = 0; i < 21; i++ ) {
                 JPanel panel = new JPanel();  // Make a new panel
                 JButton button = new JButton( "Button "+i );
                 panel.add( button );  // add the button to the panel...
                 frame.add( panel );   // ...then add the panel to the layout
              }
              frame.pack();
              frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
              frame.setLocationRelativeTo( null );
              frame.setVisible( true );
           }
        } );
     }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接