Java Swing:如何更改Grid布局中一行的大小,并允许它仅水平而不是垂直动态调整大小?

ksm*_*001 5 java layout swing grid-layout gridbaglayout

大家好,我有一个内部有三个组件的JFrame.

  1. 一份菜单
  2. 选项卡式窗格
  3. 一个有一些按钮的面板

最初我的目标是创建如下设计: 在此输入图像描述

当用户调整应用程序的大小时,一切都会调整大小.所以我想也许如果我使用简单的网格布局我的问题就会解决,所以我决定做以下事情:

  1. 选项卡式窗格中将包含一些面板,这些面板将遵循网格布局.

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

  3. JFrame也将遵循网格布局.

结果:

在此输入图像描述

你可以看到这不是我想要的,按钮太大了,尽管应用程序调整得很好:

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

提前致谢.

spl*_*bob 11

我将BorderLayout用于内容窗格.使用选项卡式窗格,并使用BorderLayout.CENTER其中的按钮面板BorderLayout.SOUTH.


Gui*_*let 7

JFrame也将遵循网格布局.

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

  1. 添加带约束的按钮面板 BorderLayout.SOUTH
  2. 添加标签窗格没有任何约束(这意味着约束BorderLayout.CENTER)

看看Swing LayoutManager教程,特别是有关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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)