为什么JFrame setSize()方法没有正确设置大小?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么JFrame setSize()方法没有正确设置大小?相关的知识,希望对你有一定的参考价值。
所以我已经在java中编程了一个学期左右,我已经有几次这个问题,最后还是开始问。
如果我制作一个JFrame
然后设置大小,例如setSize(400,800)
。框架实际上不是800 pixels
长。据我所知,它实际上更像是770 (or maybe 769) pixels
。此外,如果您将垂直尺寸设置得非常低(低于30),则框架甚至不显示,只有操作系统中的顶部窗口栏和框架不会变大,直到您转到超过30的值(所以setSize(400,0)
看起来和setSize(400,20)
一样。为什么这样,它不难解决,但它很奇怪,我很好奇为什么会这样?
如果您需要更多关于任何事情的信息,我会告诉您。
这可能是因为框架的大小包括边框的大小。
框架是具有标题和边框的顶级窗口。框架的大小包括为边界指定的任何区域。可以使用getInsets方法获得边界区域的尺寸。由于边框区域包括在框架的整体尺寸中,边框有效地遮挡了框架的一部分,约束了可用于渲染的区域和/或将子组件显示到具有左上角位置(矩形)的矩形。 left,insets.top),宽度大小为 - (insets.left + insets.right) - (insets.top + insets.bottom)。
资料来源:http://download.oracle.com/javase/tutorial/uiswing/components/frame.html
JFrame SetSize()包含Area + Border。
我认为你必须设置ContentPane
的大小
jFrame.getContentPane().setSize(800,400);
所以我建议你使用嵌入在JFrame中的JPanel,然后在那个JPanel上绘图。这会最小化您的问题。
JFrame jf = new JFrame();
JPanel jp = new JPanel();
jp.setPreferredSize(new Dimension(400,800));// changed it to preferredSize, Thanks!
jf.getContentPane().add( jp );// adding to content pane will work here. Please read the comment bellow.
jf.pack();
我是从Javadoc读到的
JFrame
类与Frame
略有不兼容。与所有其他JFC / Swing顶级容器一样,JFrame包含JRootPane
作为其唯一的子级。根窗格提供的内容窗格通常应包含JFrame
显示的所有非菜单组件。这与AWT Frame案例不同。例如,要将子项添加到AWT框架中,您需要编写:
frame.add(child);
但是,使用
JFrame
,您需要将子项添加到JFrame
的内容窗格中:
frame.getContentPane().add(child);
设置帧的大小有很多好的理由。一种是记住用户设置的最后大小,并恢复这些设置。我有这个代码似乎对我有用:
package javatools.swing;
import java.util.prefs.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
public class FramePositionMemory {
public static final String WIDTH_PREF = "-width";
public static final String HEIGHT_PREF = "-height";
public static final String XPOS_PREF = "-xpos";
public static final String YPOS_PREF = "-ypos";
String prefix;
Window frame;
Class<?> cls;
public FramePositionMemory(String prefix, Window frame, Class<?> cls) {
this.prefix = prefix;
this.frame = frame;
this.cls = cls;
}
public void loadPosition() {
Preferences prefs = (Preferences)Preferences.userNodeForPackage(cls);
// Restore the most recent mainframe size and location
int width = prefs.getInt(prefix + WIDTH_PREF, frame.getWidth());
int height = prefs.getInt(prefix + HEIGHT_PREF, frame.getHeight());
System.out.println("WID: " + width + " HEI: " + height);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int xpos = (screenSize.width - width) / 2;
int ypos = (screenSize.height - height) / 2;
xpos = prefs.getInt(prefix + XPOS_PREF, xpos);
ypos = prefs.getInt(prefix + YPOS_PREF, ypos);
frame.setPreferredSize(new Dimension(width, height));
frame.setLocation(xpos, ypos);
frame.pack();
}
public void storePosition() {
Preferences prefs = (Preferences)Preferences.userNodeForPackage(cls);
prefs.putInt(prefix + WIDTH_PREF, frame.getWidth());
prefs.putInt(prefix + HEIGHT_PREF, frame.getHeight());
Point loc = frame.getLocation();
prefs.putInt(prefix + XPOS_PREF, (int)loc.getX());
prefs.putInt(prefix + YPOS_PREF, (int)loc.getY());
System.out.println("STORE: " + frame.getWidth() + " " + frame.getHeight() + " " + loc.getX() + " " + loc.getY());
}
}
public class Main {
void main(String[] args) {
JFrame frame = new Frame();
// SET UP YOUR FRAME HERE.
final FramePositionMemory fm = new FramePositionMemory("scannacs2", frame, Main.class);
frame.setSize(400, 400); // default size in the absence of previous setting
fm.loadPosition();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
fm.storePosition();
}
});
frame.setVisible(true);
}
}
}
在OS X上,您需要考虑现有的窗口装饰。它们在高度上增加了22个像素。所以在JFrame上,你需要告诉程序:
frame.setSize(width, height + 22);
我知道这个问题已经有6年多了,但是@Kyle的答案是行不通的。
用这个
setSize(width - (getInsets().left + getInsets().right), height - (getInsets().top + getInsets().bottom));
但这总是适用于任何规模:
setSize(width + 14, height + 7);
如果你不想边框边框,只想要白色区域,这里:
setSize(width + 16, height + 39);
此外,这仅适用于Windows 10,对于MacOS用户,请使用@ ben的答案。
框架的顶部边框大小为30.您可以使用MouseInputAdapter编写用于打印框架上任何点的坐标的代码。当光标位于框架顶部边框的正下方时,y坐标不为零,如果你给300 * 300的框架尺寸,那么可以将组件放在框架上的尺寸只有300 * 270。所以如果你需要300 * 300尺寸,那么给300 * 330尺寸的框架。
以上是关于为什么JFrame setSize()方法没有正确设置大小?的主要内容,如果未能解决你的问题,请参考以下文章