在swing中,是否可以在paintComponent()中找到JPanel的宽度和高度属性?



我正试图将我放置在JPanel中的图像居中。在我的paintComponent()中,我有这些行:

        int x = (this.getWidth() - pic.getWidth(null)) / 2;
        int y = (this.getHeight() - pic.getHeight(null)) / 2;
        g2.drawImage(pic, x, y, null);

但是,图像仍然没有居中对齐。我打印出this. getwidth()和this. getheight(),这给了我图像本身的尺寸,而不是JPanel。

理想的解决方案是:

        int x = (JPANEL.GETWIDTH() - pic.getWidth(null)) / 2;
        int y = (JPANEL.GETHEIGHT() - pic.getHeight(null)) / 2;
        g2.drawImage(pic, x, y, null);

但是我的问题是,我不能访问JPanel的宽度和高度,因为这些属性是在另一个类。

我尝试创建实例变量来保存和设置JPanel的宽度和高度。但是,当我调整窗口大小时,它使用JPanel的原始宽度和高度。我不知道在调整窗口大小时如何更新代码以调整到新的JPanel的大小。什么好主意吗?

我打印出this. getwidth()和this. getheight(),这给了我图像本身的尺寸,而不是JPanel。

不,这些方法给出面板的宽度/高度而不是图像(除非你有自定义代码这样做)。

例如,你可以使用背景面板,它允许你居中的图像(在其他事项)。

注意,一个简单的方法来居中的图像是创建一个面板使用GridBagLayout。然后创建一个带有ImageIcon的JLabel,并将标签添加到面板中。默认情况下,组件会居中。

可能在绘制方法被调用时图像没有被加载。

g2.drawImage(pic, x, y, null);

以上应该是:

g2.drawImage(pic, x, y, this);

this将确保组件在加载图像时被重新绘制。

如果你需要更多的帮助与您的自定义绘画代码,然后张贴适当的SSCCE,说明问题。

我还在jpanel上设置了一个首选大小和最小大小,如果这影响到任何东西的话。

你不应该设置一个首选大小。布局管理器的工作是确定首选的大小。

当做自定义绘画时,你应该重写面板的getPreferredSize()方法来返回你的图像的大小。但是,绘制代码仍然需要计算图像位置,以处理面板尺寸与首选尺寸不同的情况。

最新更新