使用手动间隙时的组布局,错误/怪异行为

时间:2014-08-07 09:47:58

标签: 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;
 }

}

2 个答案:

答案 0 :(得分:1)

我没有看到任何不幸的事。这些差距是在容器内分发组件的指南。没有特定原因,我会坚持使用自动间隙,因为&#34;它们会自动adjust外观和感觉UI运行,反映实际的外观和感觉指南。&#34;

作为参考,我已经更新了您的示例,如下所示。根据经验,GAP的{​​{1}}手册与我平台上的自动间隙匹配,但与容器间隙不匹配。另请参阅Initial Threads

image

0

答案 1 :(得分:1)

GroupLayout经理拥有setHonorsVisibility()方法 决定在调整大小时是否考虑组件可见性 定位组件。默认值为true表示 隐藏组件的大小不会发挥作用 布局计算。

然而,差距仍然存在。所以标签之间的距离为0 标签9是九个间隙的总和。差距是布局 对象也是如此,它们不受隐藏组件的影响。

我的意思是setAutoCreateGaps()被称为。{ 布局过程结束(隐藏组件启动 一个新的布局过程)并在它之间插入间隙 现有的可见组件(如果honorsVisibility为真)。这是 为什么你的第二个例子之间只有一个差距 剩下的标签。

honorsVisibility设置为false,即可见度 组件不受尊重;换句话说,的大小 尽管它们是事实,但标签仍被考虑在内 是隐藏的。

以下示例显示设置honorsVisibility 为假:

package com.zetcode;

import java.awt.Container;
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.LayoutStyle.ComponentPlacement;

public class GroupLayoutTesting extends JFrame {

    private final 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")
    };

    public GroupLayoutTesting() {

        initUI();

        setTitle("Labels");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void initUI() {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateGaps(true);
        gl.setAutoCreateContainerGaps(true);        

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

        gl.setHonorsVisibility(false);

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

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

        ParallelGroup parGroup = gl.createParallelGroup();
        gl.setVerticalGroup(parGroup);
        parGroup.addComponent(btn);

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

        pack();
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                GroupLayoutTesting ex = new GroupLayoutTesting();
                ex.setVisible(true);
            }
        });
    }
}

屏幕截图显示两个标签保留在初始位置。

Labels