【发布时间】:2021-09-20 22:30:59
【问题描述】:
我有一个 GUI,其中四个组件通过 GridBagLayout 彼此相邻布置。当我向右调整窗口大小时,最左边的组件会抖动,当我向左调整大小时,最右边。
这是一个例子:
import javax.swing.*;
import java.awt.*;
public class GBLShakeTest extends JPanel {
public static void main(String[] args) {
JFrame frame = new JFrame("GBLShakeTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500, 500));
frame.add(new GBLShakeTest());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public GBLShakeTest() {
super(new GridBagLayout());
add(new JTextArea("component 1"), new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
add(new JTextArea("component 2"), new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
add(new JTextArea("component 3"), new GridBagConstraints(2, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
add(new JTextArea("component 4"), new GridBagConstraints(3, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
}
}
它甚至发生在仅使用 JButton 的 GridBagLayout demo from oracle 上。向右调整大小很好,但是当您向左放大窗口时,右边的 Button 会抖动。 有谁知道如何解决这个问题?
【问题讨论】:
-
如果代码被赋予了一个有意义的、描述性的类名,比如
TestGBLShake,它就不太可能与我的垃圾代码目录中的MyFrame或Test等其他类名发生冲突。布局可能一次为一个组件分配额外空间。更改班级名称,我会进一步调查。 -
它甚至发生在 oracle 的仅使用 JButton 的 GridBagLayout 演示中。 - 我还注意到使用直接添加到框架的单个 JButton 的问题。所以使用 BorderLayout。当我以中等速度向右调整大小时,我看到一个“黑色”区域,直到布局完成。当以中等速度向左调整大小时,我看到右侧边缘按钮的“重叠”图像。所以这似乎是一个 Swing 布局问题或平台问题。我使用 JDK 11 或 Windows 10。
-
这也发生在 Linux 上的 Java 16 中。我怀疑这是由于
double权重值的不精确造成的。如果只有第一个分量的权重 x 非零,则不存在“抖动”。 (抖动实际上是第一个组件的 x 坐标在 0 和 1 之间交替。) -
@camickr 我也注意到了这一点,但我认为这是一个值得单独提问的单独问题。
标签: java swing layout layout-manager gridbaglayout