我在理解应用程序的行为方面遇到了问题。我想创建一个简单的窗口( 1000x700px ),分为两部分( 250px 和 750px 宽度)。我尝试了以下代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Example extends JFrame
{
private static final long serialVersionUID = 1L;
public Example()
{
this.setSize(1000, 700);
this.setTitle("Example");
this.setResizable(false);
this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
JPanel navigation_panel_wrap = new JPanel();
JPanel content_panel_wrap = new JPanel();
navigation_panel_wrap.setPreferredSize(new Dimension(250, 700));
content_panel_wrap.setPreferredSize(new Dimension(750, 700));
content_panel_wrap.setBackground(Color.green);
navigation_panel_wrap.setBackground(Color.red);
this.getContentPane().add(navigation_panel_wrap);
this.getContentPane().add(content_panel_wrap);
}
public static void main(String[] args)
{
Example example = new Example();
example.setVisible(true);
}
}
如您所见,我手动设置JFrame
(FlowLayout
而不是BorderLayout
的布局管理器,其中水平和垂直间隙为)。当然,我可以使用BorderLayout
而不是add()
方法使用BorderLayout.EAST
和BorderLayout.WEST
参数,但我想了解FlowLayout
的错误。
当我运行我的应用程序时,我得到以下内容(没有绿色JPanel
):
如果我减小宽度(例如content_panel_wrap
并使其 744px 而不是 750px ,则一切正常。
所以问题是 - 这些奇怪的6像素是什么?我不确定这个值是否适用于所有操作系统,所以我想了解它的来源。
答案 0 :(得分:4)
FlowLayout
没有任何问题,但您需要调用pack()
才能调整所有组件的大小。
答案 1 :(得分:3)
至于您的代码问题(+1到@Reimeus),调用pack()
是解决方案。
根据文档:
使此窗口的大小适合首选大小和布局 其子组件。如果窗口和/或其所有者尚未 可显示,两者都可以在计算之前显示 首选尺寸。 Window将在preferredSize之后验证 计算。
<强>提示:强>
JFrame
。创建和更改UI组件时使用Event Dispatch Thread:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// create UI components etc here
}
});
setPreferredSize()
而是覆盖组件的getPrefferedSize()
。setSize(...)
,而是在设置JFrame
之前致电JFrame#pack()
。JFrame#defaultCloseOperation(..)
,否则JFrame
关闭时您的初始/ EDT广告将不会被终止。以下是结合我的建议和代码的示例:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Example {
private final JFrame frame;
public Example() {
frame = new JFrame();
frame.setTitle("Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//app exited when frame closes
frame.setResizable(false);
frame.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
JPanel navigation_panel_wrap = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(250, 700);
}
};
JPanel content_panel_wrap = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(750, 700);
}
};
content_panel_wrap.setBackground(Color.green);
navigation_panel_wrap.setBackground(Color.red);
frame.add(navigation_panel_wrap);
frame.add(content_panel_wrap);
//pack frame (size components to preferred size)
frame.pack();
frame.setVisible(true);//make frame visible
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
}