繁体   English   中英

Java GridBagLayout-禁用垂直填充

[英]Java GridBagLayout - disable vertical fill

我在GridBagLayout-GUI中垂直填充存在问题。 这是代码:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class Spielklasse {

public static void main(String[] args) {

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

    for (int i = 0; i < 5; i++) {
        JPanel subPanel = new JPanel(new BorderLayout());
        JLabel label = new JLabel();
        label.setText("label " + i + ":");
        JTextField textField = new JTextField();
        textField.setPreferredSize(new Dimension(120,20));

        subPanel.add(label, BorderLayout.WEST);
        subPanel.add(textField, BorderLayout.EAST);

        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.NORTHWEST;
        c.gridx = 1;
        c.gridy = i;
        c.weightx = 1;
        c.weighty = 1;
        c.insets = new Insets(10, 20, 10, 20);
        c.fill = GridBagConstraints.HORIZONTAL;
        page.add(subPanel, c);
    }

    JScrollPane scrollPane = new JScrollPane(page);

    JFrame frame = new JFrame();
    frame.setSize(300,500);
    frame.add(scrollPane);
    frame.setVisible(true);
}
}

我想在前面的标签正下方放置label + textfield,而又不填充它们之间的垂直空间(例如当您垂直调整示例大小直到可以看到垂直滚动条时)。 我该如何实现? 使用我的代码,整个面板垂直填充,但是我不想要这样。

删除下一行c.weighty = 1;

docs中阅读更多内容。

编辑:循环后,使用伪JLabel捕获可用空间:

GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 5;
c.fill = GridBagConstraints.BOTH;
c.weightx=1;
c.weighty=1;
c.gridwidth = 2;
page.add(new JLabel(" "),c);

我对您的代码做了一些更改。

  1. 始终通过调用SwingUtilities invokeLater方法来启动Swing应用程序。 这会将Swing组件放到Event Dispatch线程上

  2. 由于使用的是GridBagLayout,因此可以直接在页面JPanel上布置标签和文本字段。

  3. 我为每个标签和文本字段创建了一个GridBagConstraints。 这样,我们就不必依赖默认值。 我们为每个组件指定正确的锚点和填充值。

  4. 我添加了几个缺少的JFrame方法。 您要么必须指定默认的关闭操作,要么必须自己关闭应用程序。 没有此规范,关闭主JFrame之后,您的应用程序将继续运行。

编辑添加:

  1. 为了获得想要的效果,请将页面JPanel放在另一个JPanel中。 外部JPanel具有FlowLayout。

这是修改后的代码。

import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Spielklasse implements Runnable {

    private static final Insets baseInsets = 
            new Insets(10, 20, 10, 20);

    @Override
    public void run() {
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new FlowLayout());

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

        int gridy = 0;

        for (int i = 0; i < 5; i++) {
            JLabel label = new JLabel();
            label.setText("Label " + i + ":");
            addComponent(page, label, 0, gridy, 
                    1, 1, baseInsets, GridBagConstraints.LINE_START, 
                    GridBagConstraints.HORIZONTAL);

            JTextField textField = new JTextField(20);
            addComponent(page, textField, 1, gridy++, 
                    1, 1, baseInsets, GridBagConstraints.LINE_START, 
                    GridBagConstraints.HORIZONTAL);
        }

        mainPanel.add(page);
        JScrollPane scrollPane = new JScrollPane(mainPanel);

        JFrame frame = new JFrame("Spielklasse");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }

    private void addComponent(Container container, Component component,
            int gridx, int gridy, int gridwidth, int gridheight, 
            Insets insets, int anchor, int fill) {
        GridBagConstraints gbc = new GridBagConstraints(gridx, gridy,
                gridwidth, gridheight, 1.0D, 1.0D, anchor, 
                fill, insets, 0, 0);
        container.add(component, gbc);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Spielklasse());

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM