2

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

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

  2. 我怎样才能得到精确的屏幕中心。因此,如果我将JFrame默认设置为 200*200 像素,那么中心将为 100*100。(考虑到问题 1 中的问题)但是如果有人调整屏幕大小(是的,我希望他们能够重新调整屏幕大小),那么该点仍然是中心。因此,如果他们将其设为全屏并且屏幕尺寸为 1200*900,则中心将为 600*450。

我希望这足够清楚

4

3 回答 3

8

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

AJFrame由一个窗口/框架(通常用边框装饰)、一个JRootPane包含JLayeredPane内容窗格的aJMenuBar和玻璃窗格组成。

在此处输入图像描述

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

因此,帧的实际“可绘制”区域是它的width - border.widthxheight - border.height

在此处输入图像描述

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

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

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

于 2012-11-19T19:40:58.247 回答
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);
}
于 2012-11-19T16:03:55.723 回答
2

你可以使用一些简单的东西

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

空白将是您希望位于中心点的值。

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

于 2012-11-19T15:55:11.610 回答