Hallo liebe Java-Gemeinde,
ich möchte gerne ein Objekt draggen, welches ich in Paint Component gezeichnet habe. Leider bewegt sich mein Objekt nicht. Ich bin so vorgegangen, dass ich mir zuerst einmal ein Rechteck gezichnet habe, welches sich ohne Probleme bewegen lässt:
Ich möchte aber eine komplexere Grafik bewegen, also tausche ich das Rect gegen meine Zeichnung aus:
Was bitte muss ich an meinem Code verändern, damit dieses Objekt bewegt wird?
Vielen Dank!
ich möchte gerne ein Objekt draggen, welches ich in Paint Component gezeichnet habe. Leider bewegt sich mein Objekt nicht. Ich bin so vorgegangen, dass ich mir zuerst einmal ein Rechteck gezichnet habe, welches sich ohne Probleme bewegen lässt:
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import Components.Plate;
import Model.EFieldStateMarble;
import Model.EFieldStatePlate;
public class PlateTest extends JPanel implements MouseListener, MouseMotionListener{
//Plattengröße
private int platesize = 120;
//Plattenkoordinaten
private int plateX = 60;
private int plateY = 60;
//Position, von der die Maus die Platte zieht
private int dragFromX = 10;
private int dragFromY = 10;
//bei "true" kann die Platte nach Mausklick gezogen werden
private boolean candrag = false;
public PlateTest() {
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.fillRect(plateX, plateY, platesize, platesize);
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (x >= plateX && x <= (plateX + platesize) && y >= plateY && y <= (plateY + platesize)) {
candrag = true;
dragFromX = x - plateX;
dragFromY = y - plateY;
}
else {
candrag = false;
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (candrag) {
//Plattenposition wechseln
plateX = e.getX() - dragFromX;
plateY = e.getY() - dragFromY;
//Entferne die Platte nicht aus dem Fenster
plateX = Math.max(plateX, 0);
plateX = Math.min(plateX, getWidth() - platesize);
plateY = Math.max(plateY, 0);
plateY = Math.min(plateY, getHeight() - platesize);
this.repaint();
}
}
@Override
public void mouseExited(MouseEvent e) {
candrag = false;
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
// Plate plate = new Plate();
@Override
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PlateTest g2d = new PlateTest();
g2d.setPreferredSize(new Dimension(650, 650));
f.add(g2d);
f.pack();
f.setLocation(200, 800);
f.setVisible(true);
}
});
}
}
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import Components.Plate;
import Model.EFieldStateMarble;
import Model.EFieldStatePlate;
public class PlateTest extends JPanel implements MouseListener, MouseMotionListener{
//Plattengröße
private int platesize = 120;
//Plattenkoordinaten
private int plateX = 60;
private int plateY = 60;
//Position, von der die Maus die Platte zieht
private int dragFromX = 10;
private int dragFromY = 10;
//bei "true" kann die Platte nach Mausklick gezogen werden
private boolean candrag = false;
public PlateTest() {
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
drawPlate(g2d, 2, 2);
}
private void drawPlateField(Graphics2D g2d, int x, int y) {
int posX = x;
int posY = y;
g2d.setColor(Color.BLACK);
g2d.drawRect(posX, posY, 60, 60);
g2d.setColor(new Color(242, 203, 130));
g2d.fillRect(posX + 1, posY + 1, 59, 59);
g2d.setColor(Color.BLACK);
g2d.drawOval(x+15, y+15, 30, 30);
g2d.setColor(new Color(242, 203, 130));
g2d.fillOval(x+16, y+16, 29, 29);
}
private void drawPlate(Graphics g2d, int x, int y) {
try {
for (int r = 0; r < x; r++) {
for (int c = 0; c < y; c++) {
drawPlateField((Graphics2D) g2d, c*60, r*60);
}
}
}
catch (Exception e) {
System.out.print(e);
}
}
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (x >= plateX && x <= (plateX + platesize) && y >= plateY && y <= (plateY + platesize)) {
candrag = true;
dragFromX = x - plateX;
dragFromY = y - plateY;
}
else {
candrag = false;
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (candrag) {
//Plattenposition wechseln
plateX = e.getX() - dragFromX;
plateY = e.getY() - dragFromY;
//Entferne die Platte nicht aus dem Fenster
plateX = Math.max(plateX, 0);
plateX = Math.min(plateX, getWidth() - platesize);
plateY = Math.max(plateY, 0);
plateY = Math.min(plateY, getHeight() - platesize);
this.repaint();
}
}
@Override
public void mouseExited(MouseEvent e) {
candrag = false;
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
// Plate plate = new Plate();
@Override
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PlateTest g2d = new PlateTest();
g2d.setPreferredSize(new Dimension(650, 650));
f.add(g2d);
f.pack();
f.setLocation(200, 800);
f.setVisible(true);
}
});
}
}
Vielen Dank!