Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用手动间隙时的组布局、错误/奇怪行为_Java_Swing_Layout_Layout Manager_Grouplayout - Fatal编程技术网

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

Java 使用手动间隙时的组布局、错误/奇怪行为,java,swing,layout,layout-manager,grouplayout,Java,Swing,Layout,Layout Manager,Grouplayout,我遇到了一些有关GroupLayout的问题。 在运行时禁用元素时,手动间隙似乎被打破。 在使用自动间距时,元素之间存在根本不存在的巨大间距 自动间隙: 已启用标签: 标签1-8已禁用: 手动间隙: 已启用标签: 标签1-8已禁用: 这是一个错误,还是我忘记了一些设置 以下是相应的代码: public class GroupLayoutTesting extends JFrame{ public static void main(String[] args) {

我遇到了一些有关
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;
 }

}
公共类GroupLayoutTesting扩展了JFrame{
公共静态void main(字符串[]args){
新的GroupLayoutTesting();
}
公共组布局测试(){
超级();
这个.getContentPane().setLayout(新的BorderLayout());
此.setVisible(true);
此设置尺寸(新尺寸(600100));
此.setDefaultCloseOperation(关闭时退出);
this.getContentPane().add(getGroupLayouted());
}
静态JLabel[]标签={
新的JLabel(“标签0”),
新标签(“标签1”),
新标签(“标签2”),
新标签(“标签3”),
新标签(“标签4”),
新标签(“标签5”),
新标签(“标签6”),
新标签(“标签7”),
新标签(“标签8”),
新JLabel(“标签9”)
};
私有组件getGroupLayouted(){
JPanel面板=新的JPanel();
GroupLayout布局=新的GroupLayout(面板);

//layout.setAutoCreateGaps(true);//我看不出有什么不对劲的地方。这些间隙是在容器中分发组件的指南。没有具体原因,我会坚持使用自动间隙,因为“它们自动与UI运行时的外观和感觉相关联,反映了实际的外观和感觉准则。”

作为参考,我更新了如下所示的示例。根据经验,
0
的手动
GAP
匹配我平台上的自动间隙,但不匹配容器间隙。另请参阅

导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.GroupLayout;
导入javax.swing.GroupLayout.ParallelGroup;
导入javax.swing.GroupLayout.SequentialGroup;
导入javax.swing.JButton;
导入javax.swing.JFrame;
在关闭时导入静态javax.swing.JFrame.EXIT_;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.LayoutStyle.ComponentPlacement;
公共类GroupLayoutTesting扩展了JFrame{
专用静态最终整数间隔=0;
公共组布局测试(){
这个.getContentPane().setLayout(新的BorderLayout());
此.setDefaultCloseOperation(关闭时退出);
add(getGroupLayouted());
这个包();
此.setVisible(true);
}
静态JLabel[]标签={
新的JLabel(“标签-0”),
新JLabel(“标签-1”),
新JLabel(“标签-2”),
新JLabel(“标签-3”),
新JLabel(“标签-4”),
新JLabel(“标签-5”),
新JLabel(“标签-6”),
新JLabel(“标签-7”),
新JLabel(“标签-8”),
新JLabel(“标签-9”)
};
私有JPanel getGroupLayouted(){
JPanel面板=新的JPanel();
GroupLayout布局=新的GroupLayout(面板);
面板设置布局(布局);
layout.setAutoCreateGaps(真);
layout.setAutoCreateContainerGaps(真);
JButton btn=新JButton(“灯开关”);
btn.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
对于(int i=1;i//sequentialGroup.addPreferredGap(ComponentPlacement.UNRELATED,GAP,GAP);//
GroupLayout
管理器具有 决定在调整尺寸和尺寸时是否考虑零部件可见性 定位组件。默认值为true,表示 隐藏组件的大小不会在其中放置角色 布局计算

但是,间隙仍然存在。因此标签之间的距离为0 标签9是九个间隙的总和。这些间隙是布局 对象,并且它们不受隐藏组件的影响

我的假设是,
setAutoCreateGaps()
在 布局过程结束时(隐藏组件)启动 一个新的布局过程)并在 现有可见组件(如果<代码>荣誉可见性为真)。这是 为什么您的第二个示例在 剩余的标签

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

下面的示例显示设置
荣誉可见性
错:

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);
            }
        });
    }
}
package com.zetcode;
导入java.awt.Container;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.GroupLayout;
导入javax.swing.GroupLayout.ParallelGroup;
导入javax.swing.GroupLayout.SequentialGroup;
导入javax.swing.JButton;
导入javax.swing.JFrame;
在关闭时导入静态javax.swing.JFrame.EXIT_;
导入javax.swing.JLabel;
导入javax.swing.LayoutStyle.ComponentPlacement;
公共类GroupLayoutTesting扩展了JFrame{
专用最终JLabel[]标签={
新的JLabel(“标签0”),
新标签(“标签1”),
新标签(“标签2”),
新标签(“标签3”),
新标签(“标签4”),
新标签(“标签5”),
新标签(“标签6”),
新标签(“标签7”),
新标签(“标签8”),
新JLabel(“标签9”)
};
公共组布局测试(){
initUI();
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);
            }
        });
    }
}