JavaSwing:如何更改网格布局中一行的大小,并允许它仅在水平方向而不是垂直方向上动态调整大小?

JavaSwing:如何更改网格布局中一行的大小,并允许它仅在水平方向而不是垂直方向上动态调整大小?,java,swing,layout,grid-layout,gridbaglayout,Java,Swing,Layout,Grid Layout,Gridbaglayout,大家好,我有一个JFrame,里面有三个组件 菜单 有标签的窗格 有一些按钮的面板 最初,我的目标是创建如下设计: 当用户调整应用程序的大小时,所有内容都会调整大小。所以我想,如果我使用一个简单的网格布局,我的问题可能会得到解决,所以我决定执行以下操作: 选项卡式窗格内部将有一些面板,这些面板将遵循网格布局 底部的面板将遵循网格布局 JFrame也将遵循网格布局 结果: 正如您所看到的,这不是我想要的,按钮太大,尽管应用程序的大小调整得非常好: 按钮也可以调整大小,但仍然太大。我希望能够为

大家好,我有一个JFrame,里面有三个组件

  • 菜单
  • 有标签的窗格
  • 有一些按钮的面板
  • 最初,我的目标是创建如下设计:

    当用户调整应用程序的大小时,所有内容都会调整大小。所以我想,如果我使用一个简单的网格布局,我的问题可能会得到解决,所以我决定执行以下操作:

  • 选项卡式窗格内部将有一些面板,这些面板将遵循网格布局

  • 底部的面板将遵循网格布局

  • JFrame也将遵循网格布局

  • 结果:

    正如您所看到的,这不是我想要的,按钮太大,尽管应用程序的大小调整得非常好:

    按钮也可以调整大小,但仍然太大。我希望能够为按钮(更具体地说是它们所包含的面板)设置一个小尺寸,当用户调整应用程序的大小时,按钮只会水平调整大小,而不会垂直调整大小,这意味着只有选项卡式窗格会垂直变大。 这是可以实现的吗?我搜索并发现了gridbaglayout,我开始玩了一点,但什么也没得到。我所能做的就是:

    看起来不错,但当我调整大小时,我得到的是:


    提前感谢。

    我会使用
    边框布局
    作为内容窗格。使用
    BorderLayout.CENTER
    将选项卡式窗格放入其中,使用
    BorderLayout.SOUTH
    将按钮面板放入其中

    JFrame也将遵循网格布局

    这是你的问题。相反,使用默认的
    BorderLayout
    (因此删除将JFrame布局设置为GridLayout的调用)并

  • 添加带有约束的按钮面板
    BorderLayout.SOUTH
  • 添加无任何约束的选项卡式窗格(这意味着约束
    BorderLayout.CENTER
  • 请看一看,尤其是与之相关的示例

    小例子:

    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();
                }
            });
        }
    }
    

    +我想这也行。然后为下部面板设置首选大小。这将使其高度恒定。不要为中心面板设置大小。这样,当您展开窗口时,其他所有对象都会保持一个大小,而只有中心会展开。此外,下面板应使用
    FlowLayout
    @davidXYZ,无需在下面板上设置首选尺寸。设置首选大小是个例外@davidXYZ在开始处理pref/max/min之前,您可能需要先阅读一下sizes@MadProgrammer我使用了我在这里提到的方法,它很有效。顺便说一下,我已经读过另一篇文章了。关于如何保持喷气式飞机的恒定高度,你还有什么其他建议吗?@davidXYZ这是个难题。使用pref/min/max heights的问题在于,您开始对字体高度进行假设,这在不同平台(甚至机器)之间是不匹配的。我知道“我只为Windows写作”这一论点,但这并没有改变这样一个事实,即这通常是一种不好的做法(而且我在我的Windows框上使用的字体与你我不一样)。你解决这个问题的方式将取决于你试图实现的目标。从这个问题来看,我倾向于使用合适的布局管理器。并非每个解决方案都适合所有问题