【问题标题】:Forcing components to be stacked from top, not vertically centered强制组件从顶部堆叠,而不是垂直居中
【发布时间】:2013-01-04 22:00:04
【问题描述】:

我目前正在使用 Swing 为应用程序设计 GUI。如果您看一下图片,您会看到一个黄色的 JPanel,它位于 BorderLayout 内。此面板使用 GridBagLayout 在其中放置组件。如您所见,一行组件由一个标签、一个文本字段和一个按钮组成。目前,有两排组件,垂直居中。不过,我希望它们从面板顶部放置。我尝试设置frame.setAlignmentY(TOP_ALIGNMENT)gridBagConstraints.anchor 属性,但没有结果。我认为我解决这个问题的方法是错误的,我没有挣扎几个小时,而是求助于 stackoverflow 的好人。

所以问题是,如何强制组件的网格不垂直居中,而是在顶部?感谢您为我指明正确方向的任何建议。

编辑(代码):

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

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

/**
 * 
 * @author mt
 */
public class MainView extends JFrame {

    public MainView() {
        setPreferredSize(new Dimension(500, 500));
        getContentPane().setLayout(new BorderLayout());

        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBackground(Color.YELLOW);
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(4, 4, 4, 4);

        c.gridx = 0;
        c.gridy = 0;
        panel.add(new JLabel("PokerStars"), c);

        c.gridx = 1;
        c.gridy = 0;
        panel.add(new JTextField(20), c);

        c.gridx = 2;
        c.gridy = 0;
        panel.add(new JButton("btn"), c);

        c.gridx = 0;
        c.gridy = 1;
        panel.add(new JLabel("Full Tilt Poker"), c);

        c.gridx = 1;
        c.gridy = 1;
        panel.add(new JTextField(20), c);

        c.gridx = 2;
        c.gridy = 1;
        panel.add(new JButton("btn"), c);

        add(panel, BorderLayout.LINE_START);

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainView();
            }
        });
    }
}

【问题讨论】:

  • 可以添加一些代码吗?
  • 请发帖SSCCE。你的描述真的很难理解。仅供参考:如果您希望 anchorfill 工作,您还需要将 weightx 和/或 weighty 指定为大于 0 的值(请注意,这些值不是百分比,它们仅代表“权重”关于如何分配额外可用空间。权重的总和不一定需要加起来 1)。
  • @GuillaumePolet 抱歉不清楚。我意识到我在描述中犯了几个错误。尽管如此,这是一个希望足够的SSCCE link

标签: java swing layout gridbaglayout


【解决方案1】:

好的,解决您的问题的一种方法是在 panel 的末尾添加一个额外的“不可见”组件,并使其占用所有额外的可用垂直空间。你可以这样做:

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

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

/**
 * 
 * @author mt
 */
public class MainView extends JFrame {

    public MainView() {
        setPreferredSize(new Dimension(500, 500));
        getContentPane().setLayout(new BorderLayout());
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBackground(Color.YELLOW);
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(4, 4, 4, 4);
        panel.add(new JLabel("PokerStars"), c);

        panel.add(new JTextField(20), c);

        c.gridwidth = GridBagConstraints.REMAINDER;
        panel.add(new JButton("btn"), c);
        c.gridwidth = 1;

        panel.add(new JLabel("Full Tilt Poker"), c);

        panel.add(new JTextField(20), c);

        c.gridwidth = GridBagConstraints.REMAINDER;
        panel.add(new JButton("btn"), c);
        c.weighty = 1.0;
        panel.add(Box.createGlue(), c);

        add(panel, BorderLayout.LINE_START);

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainView();
            }
        });
    }
}

虽然这不是我最喜欢的选项,但它会以可接受的方式解决您的问题。可能有一种更有趣的方法来解决这个问题,但它需要知道您所针对的 UI 类型以及您希望在调整窗口大小时各种组件的行为方式。

在大多数情况下,你应该尽量不要设置gridx/gridy,而是使用它们的默认值(RELATIVE),这样可以让你的代码更短,如果你必须插入一个更容易维护或更多组件。

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 2012-09-13
    • 2019-04-04
    • 2018-05-11
    • 2021-03-09
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多