有图像作为JPanel的背景

时间:2013-08-23 03:00:36

标签: java swing background jpanel paintcomponent

我是Java的新手,我目前正在创建一个带图形的游戏。我有这个类从JFrame延伸。在这堂课中,我有很多需要图像作为背景的JPanel个。据我所知,为了能够在JPanel中绘制图像,我需要一个从JPanel扩展的单独类,并且该类的paintComponent方法将完成这项工作。但我不想为每个JPanel分别开设课程,我的课程太多了;而且我只关心背景。我怎样才能做到这一点?它是一个匿名的内部类?怎么样?

为了更好地理解,我提供了一些代码:

public GUI extends JFrame {
  private JPanel x;
  ...  

  public GUI() {
   x = new JPanel();
   // put an image background to x
  }

3 个答案:

答案 0 :(得分:3)

你不必为它做另一个课程吗?你可以这么做:

x = new JPanel(){
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        //draw background image
    }
};

答案 1 :(得分:3)

为什么不创建一个带有Image ??

的类
public class ImagePane extends JPanel {

    private Image image;

    public ImagePane(Image image) {
        this.image = image;
    }

    @Override
    public Dimension getPreferredSize() {
        return image == null ? new Dimension(0, 0) : new Dimension(image.getWidth(this), image.getHeight(this));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.drawImage(image, 0, 0, this);
        g2d.dispose();
    }
}

您甚至可以提供有关应该在哪里绘制的提示。

这样,你可以在需要时简单地创建一个实例

<强>更新

另一个问题是,为什么?

您可以使用JLabel为您绘制图标而无需任何其他工作......

有关详细信息,请参阅How to use labels ...

这实际上是一个坏主意,因为JLabel在计算它的首选大小时不使用它的子组件,它只在确定时使用图像的大小和文本属性它的首选尺寸,这可能导致组件尺寸不正确

答案 2 :(得分:1)

您可以单行执行此操作:

panelInstance.add(new JLabel(new ImageIcon(ImageIO.read(new File("Image URL")))));

我希望它对你有用。