Java Swing:如何更改 Grid 布局中一行的大小并允许它仅水平而不是垂直地动态调整大小?
Posted
技术标签:
【中文标题】Java Swing:如何更改 Grid 布局中一行的大小并允许它仅水平而不是垂直地动态调整大小?【英文标题】:Java Swing: How can I change the size of one row in a Grid layout and allow it to resize dynamically only horizontally and not vertically? 【发布时间】:2012-09-18 05:57:12 【问题描述】:大家好,我有一个 JFrame,里面有三个组件。
-
菜单
选项卡式窗格
带有一些按钮的面板
最初我的目标是创建如下设计:
当用户调整应用程序的大小时,所有内容也会调整大小。所以我想,如果我使用简单的网格布局,我的问题就会得到解决,所以我决定做以下事情:
选项卡式窗格内部将包含一些面板,这些面板将遵循网格布局。
底部的面板将遵循网格布局。
JFrame 也将遵循网格布局。
结果:
正如你所看到的,这不是我想要的,按钮太大了,虽然应用程序调整得很好:
按钮也会调整大小,但它们仍然太大。我希望能够为按钮(更具体地说是它们包含的面板)设置一个小尺寸,并且当用户调整应用程序的大小时,按钮只会水平调整大小而不会垂直调整,这意味着只有选项卡式窗格会变大垂直。 这是可以实现的吗?我搜索并发现了有关gridbaglayout的信息,我开始玩一点,但我没有取得任何成就。我设法做的就是以下几点:
看起来不错,但是当我调整大小时,这就是我得到的:
提前致谢。
【问题讨论】:
【参考方案1】:JFrame 也将遵循网格布局。
这是你的问题。相反,请使用默认的BorderLayout
(因此删除将 JFrame 的布局设置为 GridLayout 的调用)和
-
添加带有约束
BorderLayout.SOUTH
的按钮面板
添加没有任何约束的选项卡式窗格(这意味着约束BorderLayout.CENTER
)
查看Swing LayoutManager tutorial,尤其是与BorderLayout 相关的示例。
小例子:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
public class TestLayout
protected void initUI()
final JFrame frame = new JFrame(TestLayout.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem newItem = new JMenuItem("New...");
JMenuItem open = new JMenuItem("Open...");
fileMenu.add(newItem);
fileMenu.add(open);
menuBar.add(fileMenu);
JTabbedPane tabs = new JTabbedPane();
tabs.addTab("Tab 1", new JPanel());
tabs.addTab("Tab 2", new JPanel());
tabs.addTab("Tab 3", new JPanel());
JPanel buttonPanel = new JPanel(new GridLayout());
buttonPanel.add(new JButton("Button-1"));
buttonPanel.add(new JButton("Button-2"));
buttonPanel.add(new JButton("Button-3"));
frame.add(tabs);
frame.add(buttonPanel, BorderLayout.SOUTH);
frame.setJMenuBar(menuBar);
frame.pack();
frame.setVisible(true);
public static void main(String[] args)
SwingUtilities.invokeLater(new Runnable()
@Override
public void run()
new TestLayout().initUI();
);
【讨论】:
【参考方案2】:我会使用BorderLayout
作为内容窗格。使用BorderLayout.CENTER
将选项卡式窗格放入其中,使用BorderLayout.SOUTH
将按钮面板放入其中。
【讨论】:
+1 我认为这也可以。然后setPreferredSize
用于下部面板。这将使其高度保持不变。不要为中心面板设置大小。这样,当您展开窗口时,其他所有内容都会保持大小,而只有中心会展开。此外,下面板应使用FlowLayout
。
@davidXYZ 无需在下面板设置首选尺寸。设置首选尺寸是个例外!
@davidXYZ 您可能想先阅读一下this,然后再开始处理 pref/max/min 尺寸
@MadProgrammer 我已经使用了我在这里提到的内容并且它有效。顺便说一句,我读过另一篇文章。对于如何保持 JPanel 的高度恒定,您还有其他建议吗?
@davidXYZ 这是一个问题 22。使用 pref/min/max 高度的问题是您开始对跨平台(甚至机器)不匹配的字体高度做出假设。我知道“我只是为 Windows 写作”的论点,但这并没有改变这样一个事实,即它通常是一种不好的做法(而且我在 Windows 盒子上使用的字体可能与我们不同;))。您解决此问题的方式将归结为您要达到的目标。从问题来看,我会在使用适当的布局管理器方面犯错。并非所有解决方案都适合所有问题以上是关于Java Swing:如何更改 Grid 布局中一行的大小并允许它仅水平而不是垂直地动态调整大小?的主要内容,如果未能解决你的问题,请参考以下文章
Java Swing 如何使用DefaultTableModel交替刷新JTable?