1

I am working on a java program that is a board game. I need assistance assigning an image to the background of a JPanel. All I have right now is a moving piece that can be clicked and dragged (the board piece).

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();
    }
}
}
Joe
  • 11
  • 1
  • 2
  • [Reasons why I wouldn't use `JLabel` as a background image component](http://stackoverflow.com/questions/23665784/java-gui-background-image/23667373#23667373) – MadProgrammer Apr 18 '16 at 19:41

2 Answers2

1

Create a new JLabel add it to the frame where you want the background image to appear. Something like this:

    JLabel lblNewLabel = new JLabel("");
    lblNewLabel.setIcon(new ImageIcon("C:\\Users\\Faisal\\Desktop\\New folder\\picture-1.thumbnail.png"));
    lblNewLabel.setBounds(0, 0, 515, 367);
    frame1.add(lblNewLabel);

This is a code from my project.

  • [Reasons why I wouldn't use `JLabel` as a background image component](http://stackoverflow.com/questions/23665784/java-gui-background-image/23667373#23667373). And you `setBounds` call is supious – MadProgrammer Apr 18 '16 at 19:42
  • @MadProgrammer, Thanks for the heads-up, I am new to Java, looking out at JLabel. – Pathan Faisal Khan Apr 18 '16 at 19:45
0

The proper way to set a background on a JPanel is to create a JPanel subclass and override 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);
  }
}
ControlAltDel
  • 33,923
  • 10
  • 53
  • 80
  • Come on, you should know better by now, `paintComponent` shouldn't be `public`, you should be calling `super.paintComponent`, you should be passing `this` as the `ImageObserver` (especially for `Image`) and this is going to "scale" the image (IMHO badly) against its ratio, which will make it look ... unpleasent – MadProgrammer Apr 18 '16 at 19:44