JDesktopPane的背景设置

Eri*_*icR 1 java swing jdesktoppane

我正在为JDesktopPane使用自制的DesktopPaneUI,我已经为该类编写了正确的方法,而且我遇到了麻烦.当我调整JDesktopPane的大小时,背景图像不会随框架调整大小.图像看起来被剪裁为窗口最初打开时的大小.我给它的图像大于窗口,我仍然有这个问题.

这是我在desktopUI类的构造函数中调用的方法.

super();
this.background = javax.imageio.ImageIO.read(new File(fileName));
Run Code Online (Sandbox Code Playgroud)

有没有办法可以更改我设置UI的主类,或myDesktopPaneUI类,以便在JDesktopPane更改大小时背景仍然填充窗口?

setUI(new myDesktopPaneUI("media/bg.jpg"));
Run Code Online (Sandbox Code Playgroud)

tra*_*god 6

覆盖paint()drawImage()将图像缩放到窗格大小的方式调用:

@Override
public void paint(Graphics g, JComponent c) {
    g.drawImage(image, 0, 0, c.getWidth(), c.getHeight(), null);
}
Run Code Online (Sandbox Code Playgroud)


cam*_*ckr 5

如果您只是创建自定义 UI 来添加背景图像,则更简单的方法是对 JDesktopPane 进行自定义绘制,以便它适用于所有 LAF:

JDesktopPane desktop = new JDesktopPane()
{
    protected void paintComponent(Graphics g)
    {
        g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
    }

};
Run Code Online (Sandbox Code Playgroud)

通常您会首先调用 super.paintComponent(g),但由于图像将覆盖整个背景,因此无需这样做。

  • 即使覆盖所有内容,它也可能具有透明区域 - 因此,仅当 opaque == false 时,不调用 super 才符合 super 的合同。这不是默认情况下的,可以随时由客户端代码更改。所以这并不安全,让你的 IDE 多输入一行是......:-) (2认同)