Hallo Java-Gemeinde,
ich habe eine Klasse erstellt, mit der ich Bausteine verschiedener Größe für ein Spiel erstelle. Das funktioniert alles auch soweit gut, aber jetzt möchte ich die Bausteine auch bewegen, um sie zu einem Spielfeld zusammensetzen zu können. Leider reagiert mein Programm nicht auf Mausklicks und Mausbewegungen. Mag sich jemand mal meinen Code anschauen? Ich finde den Fehler einfach nicht.
Ich erhalte einen Compile-Fehler:
Folgende rot markierten Fehler werden ausgegeben:
In der Zeile "public class Plate extends JPanel implements MouseListener, MouseMotionListener" ganz oben, ist "Plate" markiert und möchte die Mouse-Methoden implementieren, obwohl ich die Methoden in der Klasse drin habe.
In der Main-Methode ist "setupInteractions();" markiert, dort soll ich die Methode auf "static" setzen. Wenn ich das aber mache, funktionieren natürlich die nicht-statischen Methoden "add.MouseLIstener" und "add.MouseMotionListener" nicht.
Hat jemand vielleicht ein Tipp für mich?
Vielen Dank!
ich habe eine Klasse erstellt, mit der ich Bausteine verschiedener Größe für ein Spiel erstelle. Das funktioniert alles auch soweit gut, aber jetzt möchte ich die Bausteine auch bewegen, um sie zu einem Spielfeld zusammensetzen zu können. Leider reagiert mein Programm nicht auf Mausklicks und Mausbewegungen. Mag sich jemand mal meinen Code anschauen? Ich finde den Fehler einfach nicht.
Code:
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.JPanel;
import javax.swing.SwingUtilities;
import Model.EFieldStateMarble;
import Model.EFieldStatePlate;
public class Plate extends JPanel implements MouseListener, MouseMotionListener {
// Eigenschaften
public String plate[][];
// Konstruktor
public Plate(int r, int c, EFieldStatePlate fieldStatePlate, EFieldStateMarble fieldStateMarble) {
plate = new String[r][c];
for (r = 0; r < plate.length; r++) { // waagerecht
for (c = 0; c < plate[r].length; c++) { // senkrecht
plate[r][c] = fieldStatePlate.toString() + fieldStateMarble.toString(); // Codierung
// Feld
}
}
}
// added MouseMotionListener
private void setupInteractions() {
PlateDragged plateDragged = new PlateDragged();
addMouseListener(plateDragged);
addMouseMotionListener(plateDragged);
}
// Methoden
public void showPlate() { // Konsolenausgabe Spielfeldplatte
for (int r = 0; r < plate.length; r++) {
for (int c = 0; c < plate[r].length; c++) {
System.out.print(plate[r][c]);
}
System.out.println();
}
}
// Ändert Eintrage in r-ter Reihe und c-ter Spalte
public void setEntryAt(int r, int c, EFieldStatePlate fieldStatePlate, EFieldStateMarble fieldStateMarble) {
plate[r][c] = fieldStatePlate.toString() + fieldStateMarble.toString();
}
public String[][] getPlate() {
return plate;
}
// dreht das Array um 90°
public void turnPlate() {
int m = plate.length;
int n = plate[0].length;
String[][] returnPlate = new String[n][m];
for (int r = 0; r < plate.length; r++) {
for (int c = 0; c < plate[0].length; c++) {
returnPlate[c][m - 1 - r] = plate[r][c];
}
}
plate = returnPlate;
}
// zeichnet die Platte
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
drawPlate(g2d, 60, 60);
}
// zeichnet ein Plattenfeld
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);
}
// stellt die Platten verschiedener Größe aus den Feldern zusammen
private void drawPlate(Graphics g2d, int plateX, int plateY) {
try {
for (int r = 0; r < plate.length; r++) {
for (int c = 0; c < plate[0].length; c++) {
drawPlateField((Graphics2D) g2d, plateX + c * 60, plateY + r * 60);
}
}
} catch (Exception e) {
System.out.print(e);
}
}
// bewegt die Platte
private class PlateDragged implements MouseListener, MouseMotionListener {
// Plattengröße
int platesizeX = plate.length;
int platesizeY = plate[0].length;
// Plattenkoordinaten
int plateX = 60;
int plateY = 60;
// Position, von der die Maus die Platte zieht
int dragFromX = 0;
int dragFromY = 0;
// bei "true" kann die Platte nach Mausklick gezogen werden
boolean candrag = false;
public void mousePressed(MouseEvent e) {
new Thread() {
@Override
public void run() {
int x = e.getX();
int y = e.getY();
if (x >= plateX && x <= (plateX + platesizeY) && y >= plateY && y <= (plateY + platesizeX)) {
candrag = true;
dragFromX = x - plateX;
dragFromY = y - plateY;
} else {
candrag = false;
}
System.out.println("Hallo");
}
}.start();
}
@Override
public void mouseDragged(MouseEvent e) {
new Thread() {
@Override
public void run() {
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() - platesizeY);
plateY = Math.max(plateY, 0);
plateY = Math.min(plateY, getHeight() - platesizeX);
repaint();
}
}
}.start();
}
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) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setupInteractions();
Plate g2d = new Plate(2, 3, EFieldStatePlate.B6, EFieldStateMarble.EMPTY);
g2d.setPreferredSize(new Dimension(650, 650));
f.add(g2d);
f.pack();
f.setLocation(200, 800);
f.setVisible(true);
}
}
Ich erhalte einen Compile-Fehler:
Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
at Components.Plate.main(Plate.java:112)
Folgende rot markierten Fehler werden ausgegeben:
In der Zeile "public class Plate extends JPanel implements MouseListener, MouseMotionListener" ganz oben, ist "Plate" markiert und möchte die Mouse-Methoden implementieren, obwohl ich die Methoden in der Klasse drin habe.
In der Main-Methode ist "setupInteractions();" markiert, dort soll ich die Methode auf "static" setzen. Wenn ich das aber mache, funktionieren natürlich die nicht-statischen Methoden "add.MouseLIstener" und "add.MouseMotionListener" nicht.
Hat jemand vielleicht ein Tipp für mich?
Vielen Dank!