gpt4 book ai didi

java - 强制组件从顶部堆叠,而不是垂直居中

转载 作者:行者123 更新时间:2023-11-30 11:37:12 25 4
gpt4 key购买 nike

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

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

Frame

编辑(代码):

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();
}
});
}
}

最佳答案

好的,解决问题的一种方法是在 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();
}
});
}
}

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

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

关于java - 强制组件从顶部堆叠,而不是垂直居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14157418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com