2

我一直在环顾四周并致力于制作一个JPanel能够拥有图像背景的东西。我知道有大量信息对此进行了说明(示例 1示例 2)。这些都不是我正在寻找的。

我正在寻找的是一种仅添加功能或设置背景图像的功能,JPanel同时保留其他所有内容的方法。我现在遇到的问题是我有一些扩展的类,JPanel当我更改它们以扩展我的新ImagePanel类时,构造函数失败(显然,参数不同)。我有其中一个文件的构造super( new BorderLayout() );函数,到目前为止,我可以让它发挥作用的唯一方法是放弃布局或背景图像。我不能让两者一起工作。

这是最新的绝望尝试:

import java.awt.*;
import javax.swing.JPanel;

class ImagePanel extends JPanel {

  private Image img;

  public ImagePanel(Image img, LayoutManager layout) {
    this.img = img;
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
    super.setLayout(layout);
  }

  public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }

}

如果有人可以帮助我,或者指出我正在寻找的东西,那就太好了。我不需要任何超级疯狂的功能,比如背景缩放或类似的东西。我只想让图像成为背景,并让它以所有其他方式保持其功能。

谢谢。

4

2 回答 2

2

构造函数不能在死者之间转移。也就是说,如果你扩展一个类并且不提供与父类相同的构造函数,那么你就不能使用那些构造函数签名。

例如,在您的示例源代码中,您不能调用new ImagePane(new BorderLayout())asImagePane没有与该签名匹配的构造函数,尽管事实上JPanel确实如此。

这很重要,因为它允许您引导用户使用特定的初始化路径,该路径可能对您的类版本是唯一的。

如果要重用父类中可用的构造函数,则需要在自己的类中提供这些签名,或者super(...);使用所需参数调用

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.LayoutManager;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {

    private Image img;

    public ImagePanel(LayoutManager layout) {
        super(layout);
    }

    public ImagePanel(Image img, LayoutManager layout) {
        this(layout);
        this.img = img;
    }

    public Image getImage() {
        return img;
    }

    public void setImage(Image value) {
        if (img != value) {
            Image old = img;
            img = value;
            firePropertyChange("image", old, img);
            revalidate();
        }
    }

    @Override
    public Dimension getPreferredSize() {
        Image img = getImage();
        return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(this), img.getHeight(this));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (img != null) {
            g.drawImage(img, 0, 0, this);
        }
    }

}

我还建议您阅读“执行自定义绘画”以了解有关自定义绘画的更多详细信息...

于 2013-05-16T21:00:15.520 回答
1

如果您愿意接受建议,您可以考虑使用JLayeredPane.

这些容器有层,每一层都能够存储组件。
因此,您可能有一个JPanel,或者JLabel就此而言,您的背景图像位于底层,并将其他任何东西放在另一个上JPanel,在更高的层中。

如果你想坚持你的ImagePanel,你可能也应该打电话super.paintComponent

class ImagePanel extends JPanel {
        ...

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, this);
    }
}
于 2013-05-16T20:46:12.917 回答