网格袋布局困难

时间:2019-02-27 01:04:02

标签: java swing layout-manager gridbaglayout

我正在尝试在Java Swing中创建以下GUI。经过研究后,我发现Grid Bag Layout是最灵活和“最佳”的管理器。问题是我对此有些挣扎,无法真正解决。

这是我要创建的布局:

enter image description here

这很简单,但这就是我想要的。我想从简单开始。

我从标题开始,只是按钮的第一个,但这就是发生的情况:

enter image description here

标题很好,但是按钮一直延伸到最外面。当然,这是因为:gc.fill = GridBagConstraints.HORIZONTAL,但它希望这样做,但并非一直如此。也许是帧的1/6。

无论如何,这是我的代码:

public class MainFrame extends JFrame {

    private XJLabel jlNaam, welcome;
    private XJTextField jtfNaam;
    private XJButton jbOk;
    private XJButton jbOk2;

    public MainFrame() {
        setTitle("TITLE");
        setSize(600, 400);
        setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        welcome = new XJLabel("TITLE!", 30);
        welcome.setHorizontalAlignment(SwingConstants.CENTER);

        jbOk = new XJButton("ok");
        jbOk2 = new XJButton("ok2");

        GridBagConstraints gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.insets = new Insets(10, 10, 10, 10);
        gc.anchor = GridBagConstraints.FIRST_LINE_START;

        gc.gridy = 0;
        gc.gridx = 0;
        gc.weighty = 1;
        gc.weightx = 3;
        panel.add(welcome, gc);

        gc.gridy = 1;
        gc.gridx = 0;
        gc.weighty = 1;
        gc.weightx = 1;
        panel.add(jbOk, gc);

        gc.gridy = 2;
        gc.gridx = 0;
        gc.weighty = 1;
        gc.weightx = 1;
        panel.add(jbOk2, gc);

        add(panel);

        setVisible(true);
    }

}

“ X”类没有什么特别的,它只是使它变得更好一点而已。

无论如何,有没有人可以帮助我解决这个问题?我不想写出完整的GUI,但是朝正确方向的指针会很棒!如果有更好的方法可以做到这一点,请告诉我。请注意:我在学校里,所以不能使用第三方布局管理器。所以我必须坚持使用默认值...

2 个答案:

答案 0 :(得分:1)

在您的情况下,您似乎需要3列中的组件。

在您的情况下,问题是您没有一行包含3列组件的单行,因此您无法随意放置“标题”和底部的“按钮”。

因此,如果要使用GridBagLayout,则需要伪造它。因此,在第二行中,您需要在第三列中添加一个虚拟组件。您应该可以使用Box.createHorizontalStrut(10)并将其添加到第三列的行中。

现在在第一行中,可以通过给组件gridwidth = 3

来使组件居中

在最后一行中,您使用gridx = 2添加按钮。

阅读How to Use GridBagLayout上Swing教程中的部分。那里的演示几乎完全满足您的需求。

  

我发现Grid Bag布局是使用最灵活,最“最佳”的管理器

但是,您永远不会被迫使用单个布局管理器。

例如,您可以使用垂直BoxLayout的面板。然后您将:

  1. 将标签添加到面板。
  2. 将按钮添加到面板中。
  3. 使用左对齐的FlowLayout创建一个sccond面板,并将按钮添加到按钮面板和面板中。
  4. Box.createVerticalGlue()添加到面板中。
  5. 将最后一个按钮添加到面板中。

注意:

  1. 您将需要使用setAlignmentX(...)方法在左/中/右位置正确对齐组件。

  2. 对于按钮面板,您需要使用buttonsPanel.setMaximumSize( buttons.getPreferredSize() )来防止面板高度增加。

尝试实施两个解决方案,以更好地理解嵌套布局管理器的概念。然后,您可以选择自己喜欢的未来布局选项。

答案 1 :(得分:1)

GridBagLayout是最灵活的布局管理器之一,但它也是最复杂的布局管理器之一。

很多时候,拿出一些纸张并绘制布局会更容易理解您要如何应用约束。

Example

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test extends JFrame {

    public static void main(String[] args) {
        new Test();
    }

    public Test() throws HeadlessException {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("");
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.fill = GridBagConstraints.HORIZONTAL;

            // Fill the first row
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            JLabel title = new JLabel("Title!");
            title.setHorizontalAlignment(JLabel.CENTER);
            add(title, gbc);

            // First column, second row
            gbc.anchor = GridBagConstraints.NORTHWEST;
            gbc.fill = GridBagConstraints.NONE;
            gbc.weightx = 0;
            gbc.insets = new Insets(10, 10, 10, 10);
            gbc.gridwidth = 1;
            gbc.gridy++;

            add(makeLabel("Button"), gbc);

            // First column, second row
            gbc.gridy++;
            add(makeLabel("Button 2"), gbc);

            // Second column, second row
            gbc.gridx++;
            add(makeLabel("Button 3"), gbc);

            // Last column
            gbc.gridx++;
            // The the remaining area
            gbc.weightx = 1;
            gbc.weighty = 1;
            // Bottom/right
            gbc.anchor = GridBagConstraints.SOUTHEAST;
            add(makeLabel("Button 4"), gbc);
        }

        protected JLabel makeLabel(String text) {
            JLabel label = new JLabel(text);
            label.setOpaque(true);
            label.setForeground(Color.WHITE);
            label.setBackground(Color.BLUE);
            return label;
        }
    }
}

很明显,这是直接使用GridBagLayout。根据您的需求,您可能会发现使用两个或多个复合布局更容易