【发布时间】:2011-11-05 14:46:51
【问题描述】:
大家好! 我正在尝试解决一个 - 显然 - 简单的问题,但我无法解决它。 我正在开发一个带有 Java/Swing 库的示例应用程序; 我有一个 JFrame 和一个 JPanel。 我只想实现以下目标:
JPanel必须在 JFrame 内居中。
JPanel 必须具有始终指定的大小
setPreferredSize() 方法。不得在此大小下调整其大小。
我尝试使用 GridBagLayout:这是我可以做到的唯一方式。
请参阅下面的示例:
/* file StackSample01.java */
import java.awt.*;
import javax.swing.*;
public class StackSample01 {
public static void main(String [] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(100, 100));
panel.setBackground(Color.RED);
frame.setLayout(new GridBagLayout());
frame.add(panel, new GridBagConstraints());
frame.setSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Here截图:
我不会使用 GridBagLayout 来做太简单的事情。 我尝试了一个最简单的解决方案,使用 Box,但这不起作用:
示例代码:
/* file StackSample02.java */
import java.awt.*;
import javax.swing.*;
public class StackSample02 {
public static void main(String [] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(100, 100));
panel.setBackground(Color.RED); // for debug
panel.setAlignmentX(JComponent.CENTER_ALIGNMENT); // have no effect
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalGlue());
box.add(panel);
box.add(Box.createVerticalGlue()); // causes a deformation
frame.add(box);
frame.setSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Here截图,
有什么想法吗?谢谢大家:-)
【问题讨论】:
-
您是否尝试过使用 BorderFactory 类在“面板”周围放置边框?我不是太熟悉,否则我举个更具体的例子。
-
“我不会使用 GridBagLayout 来做太简单的事情。” 为什么不呢?我对 GBL 有一种深刻而持久的厌恶,但对于这种情况,这将是我尝试的第一个布局。
-
@Andrew - 完全确认,除非使用 GBL,否则永远不会使用它 :-) 而是选择三大 Form、Mig、Design 中的一种,无论是个人最喜欢的。
-
@kleopatra 您对使用 setXxxSize() 的答案投了反对票,您能很好地为我们提供正确答案或指向正确答案的链接吗?我厌倦了阅读您的“-1 for this,-1 for that”cmets。
-
@mostruash 提示:有一个“频繁”标签 .. 老实说,我厌倦了那些没有做太多事情来寻找问题答案或投票理由的开发人员回答问题(上升和下降,并没有真正的不同)——毕竟,寻找东西是他们工作的精髓。
标签: java swing gridbaglayout