2016-04-18 2 views
0

Я работаю над программой Java, которая является настольной игрой. Мне нужна помощь, назначая изображение на фоне JPanel. Все, что у меня есть сейчас, - это движущаяся часть, которую можно щелкнуть и перетащить (доску).Как установить изображение в качестве фона 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(); 
    } 
} 
} 
+0

[Причины, почему я не стал бы использовать 'JLabel' в качестве компонента фонового изображения] (HTTP://stackoverflow.com/questions/23665784/java-gui-background-image/23667373#23667373) – MadProgrammer

ответ

0

Создайте новый JLabel, добавьте его в рамку, где вы хотите, чтобы появилось фоновое изображение. Что-то вроде этого:

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); 

Это код из моего проекта.

+0

[Причины, по которым я бы не использовал 'JLabel' в качестве компонента фонового изображения] (http://stackoverflow.com/questions/ 23665784/Java-GUI-фоновое изображение/23667373 # 23667373). И ваш вызов 'setBounds' является превосходным – MadProgrammer

+0

@MadProgrammer, спасибо за хедз-ап, я новичок в Java, глядя в JLabel. –

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); 
    } 
} 
+0

Да ладно, теперь вы должны знать, что 'paintComponent' не должен быть' public', вы должны называть 'super.paintComponent', вы должны передавать' this' как 'ImageObserver' (особенно для' Image'), и это собирается «масштабировать» изображение (ИМХО плохо) против его отношения, которое заставит его выглядеть ... неудобным – MadProgrammer

Смежные вопросы