【问题标题】:Can you set a permanent size for a JPanel inside of a JFrame?您可以在 JFrame 中为 JPanel 设置永久大小吗?
【发布时间】:2008-11-25 05:39:15
【问题描述】:
我当前的问题是我有一个带有 2x2 GridLayout 的 JFrame。在其中一个正方形内,我有一个用于显示网格的 JPanel。我正在使用 java swing 库进行实地考察...看看
Image
Java 会自动扩展每个 JLabel 以适应屏幕。我希望它只是那些蓝色方块(水)和黑色边框,而不是那个灰色空间。有没有一种方法可以永久设置该 JPanel 的大小,这样我就不必在获得确切尺寸之前将 JFrame 的大小更改一百万次,从而使灰色空间消失?
我还想设置这些按钮的大小,这样它们就不会那么大(BorderLayout 用于按钮和 TextField)
【问题讨论】:
标签:
java
swing
size
jlabel
grid-layout
【解决方案1】:
GridBagLayout 是您真正想要使用的。 GridLayout 将强制布局中每个组件的大小相同,无论您对它们施加什么大小限制。 GridBagLayout 更强大,也更复杂。研究一下the API page。使用GridBagLayout,如果您不希望组件填充整个网格空间,它们甚至可以保持您要求的大小。为了防止组件的大小发生变化,我将设置所有三个可用的大小约束:
water.setPreferredSize(new Dimension(20, 20));
water.setMinimumSize(new Dimension(20, 20));
water.setMaximumSize(new Dimension(20, 20));
对于您的按钮,我肯定会使用Bryan 提到的内部面板。如果您不希望所有按钮的大小相同,则可以使用他建议的 GridLayout 或 FlowLayout 。将所有按钮添加到该内部面板而不是主面板。
【解决方案2】:
如果您希望两个棋盘格保持相同大小,则需要将它们分别包含在各自的JPanel 中。将每个父 JPanel 设置为具有GridBagLayout 的布局类型。为每个棋盘组件设置preferedSize,然后将它们添加到各自的容器中。默认情况下,GridBagLayout 应将每个板放置在父 JPanel 的中心。所以随着窗口大小的调整,JPanel父区域会变大或变小,但里面的棋盘组件会保持不变。
或者,您可以通过将每个棋盘格设置为带有BorderLayout 布局管理器的JPanel 并添加JLabel(具有蓝色背景色) 到其BorderLayout.CENTER 位置。
至于你的按钮,试试这样:
JPanel theButtonPanel = new JPanel(new BorderLayout());
JButton button1 = new JButton("Fire");
JButton button2 = new JButton("Pass");
JButton button3 = new JButton("Forfiet");
JPanel innerButtonContainer = new JPanel(new Grid(1, 3, 8, 8));
innerButtonContainer.add(button1);
innerButtonContainer.add(button2);
innerButtonContainer.add(button3);
theButtonPanel.add(innterButtonContainer);
最后,考虑为您的 Swing 用户界面使用设计工具。 Netbeans 内置了一个出色的 UI 设计器。下载Netbeanshere。
【解决方案3】:
如果您可以在顶层框架上setResizeable( false ),则可以将布局管理器设置为空,并通过 setBounds 对每个位置和大小进行硬编码。我就是这样做的(当然取决于调整大小)。
【解决方案4】:
我已经使用第三方布局管理器TableLayout 成功解决了此类问题。您需要下载它并阅读教程,但关键是在将 JButtons 添加到布局中的位置时将对齐设置为 CENTER。