Java 插图:顶部、左侧、底部、右侧均为零
这是我用来实例化JFrame的代码示例:Java 插图:顶部、左侧、底部、右侧均为零,java,swing,layout,layout-manager,insets,Java,Swing,Layout,Layout Manager,Insets,这是我用来实例化JFrame的代码示例: public class TestFrame{ public static void main(String[] args){ JFrame frame = new JFrame(); Insets insets = frame.getInsets(); frame.setSize(new Dimension(insets.right + insets.left + 400, insets.bottom + insets.top
public class TestFrame{
public static void main(String[] args){
JFrame frame = new JFrame();
Insets insets = frame.getInsets();
frame.setSize(new Dimension(insets.right + insets.left + 400, insets.bottom + insets.top + 400));
System.out.println(String.format("Top = %d \nBottom = %d \nLeft = %d \n Right
= %d", insets.top, insets.bottom, insets.left, insets.right));
frame.setResizable(false);
frame.setVisible(true);
}
}
框架显示良好,但所有插图似乎都等于零。我需要知道顶部标题栏的大小,因为我想要一个大小为400x400的内容窗格
我在多个平台上测试了它,同样的事情也发生在windows和mac上
我做错了什么
<> LI>如果您希望您的内容窗格正好是400×400,那么我会考虑将其首选大小设置为400×400(虽然我不喜欢强制首选大小,在内容窗格上,在某些情况下,它可能是可接受的)。
pack()
这是最干净、最简单的解决方案,您不必关心边框插入。如果contentPane的大小正好为400 x 400,则创建一个类,根据其首选大小重新运行它,并将其用作contentPane:
class MyContentPane extends JPanel {
public static final int PREF_W = 400;
public static final int PREF_H = 400;
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
}
或者更好:
class MyContentPane extends JPanel {
public int prefW;
public int prefH;
public MyContentPane(int prefW, int prefH) {
this.prefW = prefW;
this.prefH = prefH;
}
public Dimension getPreferredSize() {
return new Dimension(prefW, prefH);
}
}
正如其他海报所提到的,您必须在顶层窗口上使用pack()
,并使用布局管理器
我自己不喜欢这样做,而是让各种组件的实际首选尺寸和容器的布局管理器为我做所有这些决定
pack()
你误解了你的工作,所以这看起来是“错误的” 插图不是内容窗格外部“内容”的维度。它们类似于内容窗格周围的“边框”,不允许在其中进行绘图。与边框不同,插图不重叠 窗户周围装饰的大小不是由程序决定的。它由处理焦点和窗口导航的不同程序决定。该程序称为窗口管理器。窗口管理器负责处理“顶部的标题栏”及其高度、字体等 要获得一个“精确大小”的程序,您需要向窗口管理器请求一个无帧窗口,这可以用Java实现。它不会在顶部有标题栏,也不会在边缘附近有大小调整手柄、窗口命令菜单、要关闭的红色“x”或在桌面上移动窗口的方法(尽管程序可以重新定位自己,如果编写为这样做的话) 另一种方法是在适当的维度和根窗格窗口中请求独占的“屏幕”,这有时是在游戏中完成的。这是一种限制性更强的方式,分辨率仅限于支持的屏幕大小 如果您确实希望内容窗格具有特定的大小,而不是整个窗口具有特定的大小,请参考其他关于内容窗格首选大小的优秀答案。
(在BorderLayout
中预先实现)忽略JFrame API
插入项
- 大多数
也忽略LayoutManager
,仅Insets
需要AbsoluteLayout
(以及大多数JFrame
)只能返回容器
,插入项
,边界
a) 从已经可见的容器 b) 调用后大小
JFrame(e.i.)#pack()
- 在大多数情况下,设置
,插入
,边界
,大小
比设置相反更有效,因为 a) 大多数XxxSize
可以将自己的和适当的JComponents
返回给其父级PreferredSize
- 但不包括
a)
b) 对于空容器 c)图形(2D)
&JScrollPane
,如果JList/JTable
可以使用其容器调整大小,则与生成自己的代码monstrum相反JScrollPane
JFrame=newjframe();JLabel标签=新的JLabel(“某些标签”);frame.getContentPane().add(标签);frame.getContentPane().setSize(400400);frame.pack();frame.setVisible(true)代码>我所说的不在内容窗格上,而是将另一个面板直接添加到我们设置大小的框架上。在框架上添加面板与添加到内容窗格完全相同。即使您添加了一个中间面板,它仍然无法工作。请参见此。www.java.net/node/650887这不是您在此详述的内容。在那个论坛上,这个家伙直接设置JFrame的大小。你说“设置面板的大小”。这些是不同的事情。无论如何,调用pack()会将内容窗格设置为getPreferredSize()返回的大小。在您的情况下,您没有设置任何,因此这将取决于LayoutManager,它将根据面板中的内容返回值。看看其他答案,试着解释一下:你会发现它不起作用。先前被否决了。@trashgood出于好奇,为什么重写比设置好