如何将图像设置为JPanel的背景

时间:2016-04-18 19:21:38

标签: java swing

我正在开发一个棋盘游戏的java程序。我需要协助将图像分配给JPanel的背景。我现在拥有的只是一个可以点击和拖动的移动部件(板块)。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ShapeMover {

public ShapeMover() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Shape Mover");

    initComponents(frame);

    frame.pack();
    frame.setVisible(true);
}

public static void main(String s[]) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new ShapeMover();
        }
    });
}

private void initComponents(JFrame frame) {
    frame.getContentPane().add(new DragPanel());
}
}



class DragPanel extends JPanel {

Rectangle rect = new Rectangle(0, 0, 20, 20);
int preX, preY;
boolean isFirstTime = true;
Rectangle area;
boolean pressOut = false;
private Dimension dim = new Dimension(800, 666);

public DragPanel() {
    addMouseMotionListener(new MyMouseAdapter());
    addMouseListener(new MyMouseAdapter());
}

@Override
public Dimension getPreferredSize() {
    return dim;
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g;
    if (isFirstTime) {
        area = new Rectangle(dim);
        rect.setLocation(50, 50);
        isFirstTime = false;
    }

    g2d.setColor(Color.black);
    g2d.fill(rect);
}

boolean checkRect() {
    if (area == null) {
        return false;
    }

    if (area.contains(rect.x, rect.y, rect.getWidth(), rect.getHeight())) {
        return true;
    }

    int new_x = rect.x;
    int new_y = rect.y;

    if ((rect.x + rect.getWidth()) > area.getWidth()) {
        new_x = (int) area.getWidth() - (int) (rect.getWidth() - 1);
    }
    if (rect.x < 0) {
        new_x = -1;
    }
    if ((rect.y + rect.getHeight()) > area.getHeight()) {
        new_y = (int) area.getHeight() - (int) (rect.getHeight() - 1);
    }
    if (rect.y < 0) {
        new_y = -1;
    }
    rect.setLocation(new_x, new_y);
    return false;
}

private class MyMouseAdapter extends MouseAdapter {

    @Override
    public void mousePressed(MouseEvent e) {
        preX = rect.x - e.getX();
        preY = rect.y - e.getY();

        if (rect.contains(e.getX(), e.getY())) {
            updateLocation(e);
        } else {
            pressOut = true;
        }
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        if (!pressOut) {
            updateLocation(e);
        } else {
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        if (rect.contains(e.getX(), e.getY())) {
            updateLocation(e);
        } else {
            pressOut = false;
        }
    }

    public void updateLocation(MouseEvent e) {
        rect.setLocation(preX + e.getX(), preY + e.getY());
        checkRect();

        repaint();
    }
}
}

2 个答案:

答案 0 :(得分:0)

创建一个新的JLabel,将其添加到您希望显示背景图像的帧中。 像这样:

dcl.loadAsRoot(MainComponent, '#child', injector);

这是我项目的代码。

答案 1 :(得分:0)

在JPanel上设置背景的正确方法是创建JPanel子类并覆盖paintComponent

public ImagePanel extends JPanel {
  Image im;
  public ImagePanel(Image im) {
    this.im = im;
  }

  void paintComponent(Graphics g) {
    g.drawImage(im,0,0, getWidth(), getHeight(), this);
    super.paintComponent(g);
  }
}