java - 使用手动间隙时的组布局、错误/奇怪行为

标签 java swing layout layout-manager grouplayout

我在使用 GroupLayout 时遇到一些问题。 在运行时禁用元素时,手动间隙似乎被破坏。 元素之间存在巨大的间隙,而使用自动间隙时根本不存在这种间隙。

自动间隙:

标签已启用:


标签 1-8 已禁用:


手动间隙:

启用标签:


标签 1-8 已禁用:


这是一个错误,还是我忘记了一些设置?

这里是相应的代码:

public class GroupLayoutTesting extends JFrame{

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

public GroupLayoutTesting() {
    super();

    this.getContentPane().setLayout(new BorderLayout());
    this.setVisible(true);
    this.setSize(new Dimension(600,100));
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);

    this.getContentPane().add(getGroupLayouted());
}

static JLabel[] labels = {
    new JLabel("Label 0"),
    new JLabel("Label 1"),
    new JLabel("Label 2"),
    new JLabel("Label 3"),
    new JLabel("Label 4"),
    new JLabel("Label 5"),
    new JLabel("Label 6"),
    new JLabel("Label 7"),
    new JLabel("Label 8"),
    new JLabel("Label 9")
};

private Component getGroupLayouted() {

    JPanel panel = new JPanel();
    GroupLayout layout = new GroupLayout(panel);
    //layout.setAutoCreateGaps(true); // <- automatic gaps
    panel.setLayout(layout);

    JButton btn = new JButton("Light switch");
    btn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            for(int i = 1; i<9; i++){
                labels[i].setVisible(!labels[i].isVisible());
            }
        }
    });

    SequentialGroup sequentialGroup = layout.createSequentialGroup();
    layout.setHorizontalGroup(sequentialGroup);
    sequentialGroup.addComponent(btn);
    sequentialGroup.addPreferredGap(ComponentPlacement.UNRELATED,10,10); //<- Manual gaps

    for(int i=0; i<10; i++) {
        sequentialGroup.addComponent(labels[i]);
        sequentialGroup.addPreferredGap(ComponentPlacement.UNRELATED,10,10); //<- Manual gaps
    }

    ParallelGroup parallelGroup = layout.createParallelGroup();
    layout.setVerticalGroup(parallelGroup);
    parallelGroup.addComponent(btn);

    for(int i=0; i<10; i++) {
        parallelGroup.addComponent(labels[i]);
    }

    return panel;
 }

}

最佳答案

我没有看到任何不妥之处。这些间隙是在容器内分布组件的指南。如果没有特定原因,我会坚持使用自动间隙,因为“它们自动 adjust 适应 UI 运行时的外观和感觉,反射(reflect)实际的外观和感觉指南。”

作为引用,我已更新您的示例,如下所示。根据经验,0 的手动 GAP 与我的平台上的自动间隙匹配,但与容器间隙不匹配。另请参阅Initial Threads .

image

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.ParallelGroup;
import javax.swing.GroupLayout.SequentialGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.LayoutStyle.ComponentPlacement;

public class GroupLayoutTesting extends JFrame {

    private static final int GAP = 0;

    public GroupLayoutTesting() {
        this.getContentPane().setLayout(new BorderLayout());
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.add(getGroupLayouted());
        this.pack();
        this.setVisible(true);
    }

    static JLabel[] labels = {
        new JLabel("Label-0"),
        new JLabel("Label-1"),
        new JLabel("Label-2"),
        new JLabel("Label-3"),
        new JLabel("Label-4"),
        new JLabel("Label-5"),
        new JLabel("Label-6"),
        new JLabel("Label-7"),
        new JLabel("Label-8"),
        new JLabel("Label-9")
    };

    private JPanel getGroupLayouted() {
        JPanel panel = new JPanel();
        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);

        JButton btn = new JButton("Light switch");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (int i = 1; i < labels.length - 1; i++) {
                    labels[i].setVisible(!labels[i].isVisible());
                }
            }
        });

        SequentialGroup sequentialGroup = layout.createSequentialGroup();
        layout.setHorizontalGroup(sequentialGroup);
        sequentialGroup.addComponent(btn);
        //sequentialGroup.addPreferredGap(ComponentPlacement.UNRELATED, GAP, GAP); //<- Manual gaps

        for (int i = 0; i < 10; i++) {
            sequentialGroup.addComponent(labels[i]);
            //sequentialGroup.addPreferredGap(ComponentPlacement.UNRELATED, GAP, GAP); //<- Manual gaps
        }

        ParallelGroup parallelGroup = layout.createParallelGroup();
        layout.setVerticalGroup(parallelGroup);
        parallelGroup.addComponent(btn);

        for (int i = 0; i < 10; i++) {
            parallelGroup.addComponent(labels[i]);
        }
        return panel;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new GroupLayoutTesting();
        });
    }
}

关于java - 使用手动间隙时的组布局、错误/奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25179300/

相关文章:

java - 安卓。记录应用程序输出的替代方法

java - 修改 Boyer Moore 以进行多模式搜索

java - 用同步块(synchronized block)替换 volatile 不起作用

java - 无法将项目添加到自定义绘制的 JPanel

java - 如何传递paintComponent和对象以及绘制某些东西所需的逻辑?

cakephp render-false 操作仍然回显 html 模板

java - 为什么 Android Studio 会丢弃我的代码样式设置?

Java Swing g.drawString 自动换行

相同屏幕分辨率下的 Java 布局差异

html - Mac 和 Windows 之间 <span> 中的字体定位差异