【发布时间】:2022-01-08 00:09:40
【问题描述】:
我可以消除容器周围的随机红线还是这是 JDK 中的错误?
3x3 网格使用enchor 约束添加了 9 个尺寸更小的组件,但未按预期工作。
重现问题的完整源代码
import static java.awt.Color.red;
import static java.awt.Color.white;
import static java.awt.GridBagConstraints.CENTER;
import static java.awt.GridBagConstraints.FIRST_LINE_END;
import static java.awt.GridBagConstraints.FIRST_LINE_START;
import static java.awt.GridBagConstraints.LAST_LINE_END;
import static java.awt.GridBagConstraints.LAST_LINE_START;
import static java.awt.GridBagConstraints.LINE_END;
import static java.awt.GridBagConstraints.LINE_START;
import static java.awt.GridBagConstraints.PAGE_END;
import static java.awt.GridBagConstraints.PAGE_START;
import static javax.swing.BorderFactory.createLineBorder;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GridBagLayoutTest {
public static void main(String[] args) {
JPanel pane = new JPanel(new GridBagLayout());
pane.setBackground(red);
pane.setPreferredSize(new Dimension(500, 500));
// pane.setBorder(createEmptyBorder());
// pane.setBorder(createLineBorder(white, 1));
pane.setBorder(createLineBorder(white, 2));
// pane.setBorder(createLineBorder(white, 3));
GridBagConstraints c = new GridBagConstraints();
c.weightx = 1;
c.weighty = 1;
c.gridx = 0;
c.gridy = 0;
c.anchor = FIRST_LINE_START;
pane.add(rectangle(), c);
c.gridx = 1;
c.gridy = 0;
c.anchor = PAGE_START;
pane.add(rectangle(), c);
c.gridx = 2;
c.gridy = 0;
c.anchor = FIRST_LINE_END;
pane.add(rectangle(), c);
c.gridx = 0;
c.gridy = 1;
c.anchor = LINE_START;
pane.add(rectangle(), c);
c.gridx = 1;
c.gridy = 1;
c.anchor = CENTER;
pane.add(rectangle(), c);
c.gridx = 2;
c.gridy = 1;
c.anchor = LINE_END;
pane.add(rectangle(), c);
c.gridx = 0;
c.gridy = 2;
c.anchor = LAST_LINE_START;
pane.add(rectangle(), c);
c.gridx = 1;
c.gridy = 2;
c.anchor = PAGE_END;
pane.add(rectangle(), c);
c.gridx = 2;
c.gridy = 2;
c.anchor = LAST_LINE_END;
pane.add(rectangle(), c);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(600, 600));
frame.getContentPane().setLayout(new GridBagLayout());
frame.getContentPane().setBackground(white);
frame.getContentPane().add(pane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static JPanel rectangle() {
JPanel rect = new JPanel();
rect.setBackground(white);
rect.setPreferredSize(new Dimension(100, 100));
return rect;
}
}
【问题讨论】:
-
我无法使用
GridBagLayout让它工作。你会改用GridLayout解决吗? -
顺便说一句,这样做的目的是什么?例如。它是棋盘游戏中的 5x5 网格吗?
-
感谢您的回答!这不是 5x5 网格,而是 3x3 网格,其中 9 个单元格填充了 9 个较小的矩形,并添加了
anchor约束,这无法按预期工作。该示例是合成的,以明确舍入问题。我正在我的应用程序中构建左侧菜单面板,发现我的“左下菜单按钮”不能很好地贴在左下角... -
如果您从官方布局教程页面运行 jnlp example,您会发现在调整窗口大小时,按钮会随机粘在或不粘在外窗口上。这太可怕了:(
-
@Mike 好吧,如果课程没有按照您想要的方式工作,我们无能为力。在您的问题中,您没有提到您认为问题是舍入错误。我花时间向您证明这是一个舍入问题,因此无法使用 GridBagLayout 解决该问题。然后我提出了多个建议,允许您使用不同的方法或布局管理器来解决问题。所以是的,答案/cmets 中提供的信息确实回答了这个问题,可能对其他人有帮助。回复时不要忘记“@...”标签。
标签: java swing layout-manager gridbaglayout