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