7

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

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

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

当用户调整应用程序的大小时,所有内容也会调整大小。所以我想也许如果我使用简单的网格布局我的问题会得到解决,所以我决定做以下事情:

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

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

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

结果:

在此处输入图像描述

正如你所看到的,这不是我想要的,按钮太大了,虽然应用程序调整得很好:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

提前致谢。

4

2 回答 2

13

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

于 2012-09-26T14:58:18.647 回答
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();
            }
        });
    }
}
于 2012-09-26T14:58:37.277 回答