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?

如何在java中制作自定义嵌套布局[关闭]

如何识别线性布局中一系列表格单元格的视图ID

如何在 java swing 运行时更改语言

Java Swing - 如何更改 JPanel 的 TitledBorder 上的字体大小?

java swing 编程中,如何实现点击按钮弹出新的窗口???