如何获得精确的屏幕中间,即使重新resize

好的,这类问题有两个部分。

  1. 当我制作一个JFrame并在上面画一些东西的时候,即使我把宽度设置为400,并且使得当一个物品碰到它(当然,允许物品的宽度),它会弹回来。 但由于某种原因,屏幕总是会出现10像素左右的偏差。 有没有办法解决这个问题,还是我只需要通过加/减号来弥补?

  2. 我怎样才能得到精确的屏幕中心。 所以,如果我制作一个默认为200 * 200像素的JFrame ,那么中心就是100 * 100。 (考虑到问题1的问题)但是如果有人调整屏幕大小(是的,我希望他们能够重新resize),那么这个问题仍然是重中之重。 所以如果他们把它做成全屏,屏幕尺寸是1200 * 900,那么中心就是600 * 450。

我希望这是清楚的

从你所说的话,我认为你误解了正常(装饰)框架的尺寸。

JFrame包含一个窗口/框架(通常用边框装饰),一个JRootPane ,它包含一个包含内容窗格, JMenuBar和玻璃窗格的JLayeredPane

在这里输入图像描述

这是您不应该重写顶级容器paint方法的原因之一,因为您实际上不会在内容/视图区域内绘画。

所以,一个框架的实际“可绘画”区域是width - border.width x height - border.height

在这里输入图像描述

红线表示框架,蓝色表示内容窗格。

这提出了一个非常重要的问题,框架的中心在哪里? 从框架的angular度来看,它是100×100,但从内容窗格的angular度来看,它是92×81。 取决于你想要什么,取决于你将使用哪个值。 为了定位框架,您将需要使用框架中心点进行绘制,您将要使用内容窗格。

现在,在屏幕上居中框架的最简单的方法就是调用Window#setLocationRelativeTo(null)否则,我build议你使用Timr的解决scheme;)

这是我用来在屏幕上居中一个JFrame ,它只是检索您的显示器的高度和宽度,然后居中您的框架

 public static void moveToCenterScreen(JFrame frame) { Toolkit kit = frame.getToolkit(); GraphicsDevice[] gs = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(); Insets in = kit.getScreenInsets(gs[0].getDefaultConfiguration()); Dimension d = kit.getScreenSize(); int max_width = (d.width - in.left - in.right); int max_height = (d.height - in.top - in.bottom); frame.setLocation((int) (max_width - frame.getWidth()) / 2, (int) (max_height - frame.getHeight() ) / 2); } 

你可以使用简单的东西

 int ___ = (Jframe.getWidth())/2 int ___ = (Jframe.getHeight())/2 

空白将是你想要在中心点的价值。

至于另一个问题,你可能有一些填充或东西,正在移动的项目。 不知道没有看到它的代码。