在Java Swing中放置JSeparator后的间隙大小问题

3

我在Java Swing中遇到了一个简单的问题。我将我的代码简化为以下片段。我不确定如何将水平JSeparator与下一个JTextField之间的间隙最小化,因为当前代码在两者之间生成了很大的间隙。

        GroupLayout layout = new GroupLayout(jPanel1);          
        jPanel1.setLayout(layout);

        layout.setHorizontalGroup(layout.createParallelGroup()
            .addGroup(layout.createSequentialGroup()
                  .addGroup(layout.createSequentialGroup()
                        .addComponent(button)
                      ))
                  .addComponent(jSeparator)
                  .addComponent(jTextField)
            );
        layout.setVerticalGroup(layout.createSequentialGroup()
                .addComponent(button)
                .addComponent(jSeparator)
                .addComponent(jTextField)
            );  

而且一般来说,我如何控制间隙大小到任何整数表示值,而不是使用addPreferredGap

谢谢。

好的,这是从上面发布的代码生成的窗口:

enter image description here

您可以看到JSeparator和JTextField之间的空间非常宽。


2
我很难从片段中想象出来;GroupLayout不是为可读性而知名的。一些上下文、屏幕截图和 sscce 可能会有所帮助。 - trashgod
1
这是使用IDE(如NetBeans)的陷阱。 - Moonbeam
@Moonbeam:我没有使用集成开发环境(IDE)。 - Qiang Li
@Qiang Li,那你为什么要使用GroupLayout?! 呃! :) - Moonbeam
1
@Moobeam:我认为它是最强大和灵活的布局管理器。 - Qiang Li
@Qiang Li,那是主观的,我怀疑没有人会同意。 - Moonbeam
2个回答

3
缺少你的sscce,问题似乎出现在你没有展示的代码中。可能涉及到父容器的布局或pack()。请注意,JFrame的默认布局是BorderLayout;默认位置是CENTER。这里有一个sscce,可以与你的代码进行比较。
补充说明:你评论说你GroupLayout面板的父级是另一个JPanel,你问了以下问题,

你知道如何在我的情况下使它工作吗?

是的,请给包含的JPanel一个合适的布局,例如下面显示的GridLayout。后者的行为方式与JFrameBorderLayout.CENTER类似。 GroupPanel
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;

/** @see https://dev59.com/plnUa4cB1Zd3GeqPaXKv */
public class GroupPanel extends JPanel {

    private final JButton button = new JButton("Start");
    private final JSeparator jSeparator = new JSeparator();
    private final JTextField jTextField = new JTextField(10);

    public GroupPanel() {
        GroupLayout layout = new GroupLayout(this);          
        this.setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);
        layout.setHorizontalGroup(layout.createParallelGroup()
            .addComponent(button)
            .addComponent(jSeparator)
            .addComponent(jTextField)
        );
        layout.setVerticalGroup(layout.createSequentialGroup()
            .addComponent(button, GroupLayout.PREFERRED_SIZE,
                GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addComponent(jSeparator, GroupLayout.PREFERRED_SIZE,
                GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addComponent(jTextField, GroupLayout.PREFERRED_SIZE,
                GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
        );
    }

    private static void display() {
        JFrame f = new JFrame("GroupPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new GridLayout(1, 0));
        f.add(new GroupPanel());
        f.add(new GroupPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}

谢谢您的回复。实际上,我做了与您不同的事情。我在JFrame中使用了一个JPanel,而其他所有内容都在JPanel中。换句话说,我为JPanel1设置了GroupLayout,您可以从我的代码中看到。您知道如何在我的情况下使其工作吗? - Qiang Li
啊哈,我明白了!你的代码也不起作用!至少不是我想要的效果。如果你调整窗口大小,你会看到几乎与我附加的截图相同的效果:水平分隔符与文本字段之间有一个很大的间隙。 - Qiang Li
你介意修改上面的代码使其能够工作吗?我的原始问题仍然存在,我不确定该如何解决。非常感谢。 - Qiang Li
要查看默认的FlowLayout,只需删除new GridLayout()BoxLayout留给读者自己练习。由于您正在使用GUI编辑器,请尝试不同的布局并检查生成的代码。 - trashgod
你尝试使用你上面提供的代码调整窗口大小了吗?它会生成和我发布的相同的窗口。 :( - Qiang Li
显示剩余4条评论

2
在垂直布局中,可以按以下方式添加分隔符:
addComponent(separator, GroupLayout.PREFERRED_SIZE,
             GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接