我遇到了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;
}
}
答案 0 :(得分:1)
我没有看到任何不幸的事。这些差距是在容器内分发组件的指南。没有特定原因,我会坚持使用自动间隙,因为&#34;它们会自动adjust外观和感觉UI运行,反映实际的外观和感觉指南。&#34;
作为参考,我已经更新了您的示例,如下所示。根据经验,GAP
的{{1}}手册与我平台上的自动间隙匹配,但与容器间隙不匹配。另请参阅Initial Threads。
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);
}
});
}
}
屏幕截图显示两个标签保留在初始位置。