为什么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尺寸的框架。