2维网格按钮的最佳摆动布局?

问题描述:

我试图创建一个JDialog就像在Microsoft Word中的符号对话框,你可以通过选择Symbol ...插入菜单。基本上,它是一个n x mnm直到运行时才知道)小网格按钮。我已经得到了这个工作的第一个版本很好地使用GridLayout。问题在于,当您调整对话框的大小(并且需要您可以调整其大小)时,按钮的大小会发生变化。我需要按钮的大小保持不变。2维网格按钮的最佳摆动布局?

但我想包含按钮的网格的尺寸改变。例如,如果对话框变宽,但保持高度相同,行数应该减少,而列数增加。

我认为一对夫妇的方式来解决这个问题的:

  1. 当调整大小的对话框中,创建一个新的网格布局,并与按钮重新填充它。我会试试看看它的外观,但这似乎是一种笨拙的做法。
  2. 使用其他类型的布局,如FlowLayout。我采取了一个刺,但它把所有n x m按钮在一行中。我不想使用水平滚动条,并且按钮从右边缘跑出。无论如何,它应该是一个二维的按钮网格。

解决此布局问题的最佳方法是什么?

+0

如何使用gridlayout为JPanel持有按钮,然后将此JPanel嵌套到另一个JPanel中,该JPanel使用FlowLayout或其他一些不调整按钮控制JPanel的布局。 – 2011-04-20 15:20:19

+0

这实际上是MByD发布的代码。虽然它建议使用BoxLayout,但演示程序确实使用带默认布局的JPanel,这是一个FlowLayout。 – camickr 2011-04-20 15:43:04

如果对话框变宽,但保持高度相同,行数应该减少,而列数增加。

Wrap Layout可能是你在找什么。

使用GridLayout创建一个按钮面板,并设置一个固定大小(可以在运行时计算)。按钮面板应包含在BoxLayout面板中。

退房的BoxLayout Tutorial

非常非常基本的例子:

public static void main(String[] args) throws Exception 
    { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel buttonPanel = new JPanel(); 
     JPanel containerPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(2,2)); 
     buttonPanel.add(new JButton("1")); 
     buttonPanel.add(new JButton("2")); 
     buttonPanel.add(new JButton("3")); 
     buttonPanel.add(new JButton("4")); 
     buttonPanel.setPreferredSize(new Dimension(300, 400)); 
     containerPanel.add(buttonPanel); 

     frame.getContentPane().add(containerPanel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
+1

+1,最简单。尽管您应该将描述更改为使用FlowLayout,因为这是您的演示代码正在执行的操作。 – camickr 2011-04-20 15:31:33

+0

确实,按钮在这里保持相同的尺寸。问题是封闭的面板保持相同的尺寸。我想要的是包含按钮的网格的尺寸改变。例如,如果对话框变宽,但保持高度相同,行数应该减少,而列数增加。 – 2011-04-20 15:42:23

+0

@保罗 - 这真的不明白。你想有一个默认的“网格”视图,但是当改变大小以改变它到不同的视图?我认为一个解决方案必须包括硬编码值或一些计算,我不确定你会喜欢。另一种选择是为每个按钮创建固定大小的面板,但我不认为你会喜欢这一点。 – MByD 2011-04-20 17:42:58

我有按钮的一列类似的问题,并发现MiGLayout(第三方,提供here)对此很简单有效。它帮助制作网格和设置按钮尺寸,尽管我花了一两天的时间去习惯它的语法。

但关键是真的设置按钮的大小; GridLayout当然似乎是一种布局的方式,即网格。我没有测试过,但我怀疑内置的setXSize()方法也可以。 GridBagLayout tutorial有一些你可以用尺寸/定位做的事情的例子。

FlowLayout将是一条路,但您可能会遇到一些配置问题。父组件使用什么布局管理器?