即使在重新调整大小时,如何获得屏幕的中间位置

时间:2012-11-19 15:45:16

标签: java swing

好的,这类问题包含两部分。

  1. 当我制作一个JFrame并在其上绘制一些东西时,即使我将宽度设为400,并使其在项目击中时也是如此(当然,允许物品宽度)它反弹回来。但出于某种原因,它总是离屏幕大约10个像素。有没有办法解决它,或者我只是需要通过加/减数字来补偿?

  2. 如何获得EXACT屏幕中心。因此,如果我将JFrame默认设置为200 * 200像素,则中心将为100 * 100。 (允许问题1中的问题)但是如果某人调整屏幕大小(是的,我希望他们能够重新调整大小),那么这一点仍然是中心。因此,如果他们全屏显示,屏幕尺寸为1200 * 900,则中心为600 * 450。

  3. 我希望这很清楚

3 个答案:

答案 0 :(得分:7)

从您所说的声音来看,我认为您误解了普通(装饰)框架的尺寸包括什么。

JFrame包含一个窗口/框架(通常用边框修饰),JRootPane,其中包含JLayeredPane,其中包含内容窗格JMenuBar和玻璃窗格。

enter image description here

这是您永远不应该覆盖顶级容器paint方法的原因之一,因为您实际上不会在内容/视图区域内进行绘制。

因此,框架的实际“可绘制”区域是width - border.width x height - border.height

enter image description here

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

这提出了一个非常重要的问题,框架的中心在哪里?从框架的角度来看,它是100x100,但从内容窗格的角度来看,它是92x81。根据您的需要,取决于您将使用的值。要定位框架,您需要使用框架中心点进行绘画,您将需要使用内容窗格。

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

答案 1 :(得分:3)

这是我用来将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);
}

答案 2 :(得分:2)

你可以使用简单的

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

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

至于另一个问题,你可能会有一些填充物或者正在移动物品的东西。不确定没有看到它的代码。