Hallo
Eine bestimmte Anzahl von Kreisen werden gezeichnet. Danach möchte ich eine Linie zwischen zwei Kreisen nach einem Mausklick ziehen. Die Liste mit allen Kreisen wird mit den Koordinaten des Mausklicks verglichen. Wenn ein Kreis gefunden wird, wird eine Linie gezeichnet.
Mein Problem ist, dass irgendwie die Koordinaten nicht übereinstimmen. D.h. schon das Anklicken eines Kreises klappt nicht. Und wenn ich dann zufällig irgendwo was treffe, zeichnet mir die Linie auch nicht dort, wo ich die Maus hatte, sondern ganz wo anders.
Ich vermute, dass es daran liegt, dass ich beim Zeichnen translate() verwende.
Vielleicht findet jemand meinen Fehler oder hat einen Tipp.
Hier mein Code:
Eine bestimmte Anzahl von Kreisen werden gezeichnet. Danach möchte ich eine Linie zwischen zwei Kreisen nach einem Mausklick ziehen. Die Liste mit allen Kreisen wird mit den Koordinaten des Mausklicks verglichen. Wenn ein Kreis gefunden wird, wird eine Linie gezeichnet.
Mein Problem ist, dass irgendwie die Koordinaten nicht übereinstimmen. D.h. schon das Anklicken eines Kreises klappt nicht. Und wenn ich dann zufällig irgendwo was treffe, zeichnet mir die Linie auch nicht dort, wo ich die Maus hatte, sondern ganz wo anders.
Ich vermute, dass es daran liegt, dass ich beim Zeichnen translate() verwende.
Vielleicht findet jemand meinen Fehler oder hat einen Tipp.
Hier mein Code:
Java:
public class Spielfeld extends JPanel{
private int startX;
private int startY;
private int endX;
private int endY;
private int[][] spielfeld;
private ArrayList<Insel> listInseln;
private ArrayList<Bruecke> listBruecken;
private ArrayList<Bruecke> listGezeichneteBruecken;
private int d=38;
public static final int ABSTAND = 80;
public static final int DURCHMESSER=80;
Insel insel;
Insel nextInsel;
Bruecke brueckeNeu;
public Spielfeld(ArrayList<Insel> listInseln, ArrayList<Bruecke> listBruecken) {
this.listBruecken=listBruecken;
this.listInseln = listInseln;
listGezeichneteBruecken= new ArrayList<Bruecke>();
setSpielfeld(new int[Generator.breite][Generator.hoehe]);
spielfeldInitialisieren();
repaint();
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e))
{
// x- und y- Wert des Mausklicks
startX = e.getX();
startY = e.getY();
if (isInsideNord(startX, startY)) {
nextInsel=insel.naechsteInselNord(insel, listInseln);
brueckeNeu = new Bruecke(nextInsel.getId(), insel.getId(), listGezeichneteBruecken, nextInsel.getPosInselX(), nextInsel.getPosInselY(), insel.getPosInselX(), insel.getPosInselY(), false);
brueckeNeu.setzeBruecke(brueckeNeu, listGezeichneteBruecken);
}
else if (isInsideOst(startX, startY)){
nextInsel=insel.naechsteInselOst(insel, listInseln);
brueckeNeu = new Bruecke(insel.getId(), nextInsel.getId(), listGezeichneteBruecken, insel.getPosInselX(), insel.getPosInselY(), nextInsel.getPosInselX(), nextInsel.getPosInselY(), false);
brueckeNeu.setzeBruecke(brueckeNeu, listGezeichneteBruecken);
}
else if (isInsideSued(startX, startY)){
nextInsel=insel.naechsteInselSued(insel, listInseln);
brueckeNeu = new Bruecke(insel.getId(), nextInsel.getId(), listGezeichneteBruecken, insel.getPosInselX(), insel.getPosInselY(), nextInsel.getPosInselX(), nextInsel.getPosInselY(), false);
brueckeNeu.setzeBruecke(brueckeNeu, listGezeichneteBruecken);
}
else if (isInsideWest(startX, startY)) {
nextInsel=insel.naechsteInselWest(insel, listInseln);
brueckeNeu = new Bruecke(nextInsel.getId(), insel.getId(), listGezeichneteBruecken, nextInsel.getPosInselX(), nextInsel.getPosInselY(), insel.getPosInselX(), insel.getPosInselY(), false);
brueckeNeu.setzeBruecke(brueckeNeu, listGezeichneteBruecken);
}
}
if (SwingUtilities.isRightMouseButton(e))
{
}
endX=nextInsel.getPosInselX();
endY=nextInsel.getPosInselY();
//brueckeNeu.setzeBruecke(brueckeNeu, listGezeichneteBruecken);
repaint();
}
});
}
// Raster zeichnen
@Override
public void paintComponent(Graphics g) {
//super.paintComponent(g);
g.translate(ABSTAND, ABSTAND);
zeichneInsel(g);
if(listGezeichneteBruecken.size()>0) {
zeichneBruecke(g);
}
}
private void zeichneInsel(Graphics g) {
for(Insel ins:listInseln) {
String s = String.valueOf(ins.getAnzBruecken());
g.drawString(s, spielfeld[ins.getPosInselX()][ins.getPosInselY()]+ ABSTAND*ins.getPosInselX(), spielfeld[ins.getPosInselX()][ins.getPosInselY()]+ABSTAND*ins.getPosInselY());
g.drawOval(spielfeld[ins.getPosInselX()][ins.getPosInselY()]+ ABSTAND*ins.getPosInselX(), spielfeld[ins.getPosInselX()][ins.getPosInselY()]+ABSTAND*ins.getPosInselY(), DURCHMESSER/2, DURCHMESSER/2);
}
}
private void zeichneBruecke(Graphics g) {
berechneStandortBruecke(endX, endY);
System.out.println("Brücke: " +startX +", "+startY +" und " +endX +", " +endY);
g.setColor(Color.PINK);
g.drawLine(startX, startY, endX, endY);
}
// Spielfeld initialisieren
private void spielfeldInitialisieren() {
for (int i = 0; i < Generator.breite; i++) {
for (int y = 0; y < Generator.hoehe; y++) {
spielfeld[i][y] = 0;
}
}
}
void berechneStandortBruecke(int x2, int y2) {
endX = x2 * ABSTAND +DURCHMESSER/2;
endY = y2 * ABSTAND + DURCHMESSER/2;
}
/**
* Prüft, ob der Mausklick der Klicksektor "Nord" trifft und gibt die gefundene Insel an.
*
* @param mausX X-Wert der Maus beim Klicken
* @param mausY Y-Wert der Maus beim Klicken
* @return true, wenn Mausklick im Klicksektor Nord trifft
*/
boolean isInsideNord(int mausX, int mausY) {
boolean isInside=false;
//mittelpunktX
//for(Insel i: listInseln) {
for(int i=0; i<listInseln.size(); i++) {
if((listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2) - d < mausX && mausX < (listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2) + d
&& (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2) > mausY && mausY > (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2) - d
&& Math.abs(mausX-(listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2)) < Math.abs(mausY - (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2))) {
insel=listInseln.get(i);
return isInside=true;
}
}
return isInside;
}
/**
* Prüft, ob der Mausklick der Klicksektor "Ost" trifft und gibt die gefundene Insel an.
*
* @param mausX X-Wert der Maus beim Klicken
* @param mausY Y-Wert der Maus beim Klicken
* @return true, wenn Mausklick im Klicksektor Ost trifft
*/
boolean isInsideOst(int mausX, int mausY) {
boolean isInside=false;
//for(Insel i: listInseln) {
for(int i=0; i<listInseln.size(); i++) {
if((listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2) < mausX && mausX < (listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2) + d
&& (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2) -d < mausY && mausY < (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2) + d
&& Math.abs(mausY - (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2)) < Math.abs(mausX - (listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2))) {
insel=listInseln.get(i);
return isInside=true;
}
}
return isInside;
}
/**
* Prüft, ob der Mausklick der Klicksektor "Süd" trifft und gibt die gefundene Insel an.
*
* @param mausX X-Wert der Maus beim Klicken
* @param mausY Y-Wert der Maus beim Klicken
* @return true, wenn Mausklick im Klicksektor Süd trifft
*/
boolean isInsideSued(int mausX, int mausY) {
boolean isInside=false;
//for(Insel i:listInseln) {
for(int i=0; i<listInseln.size(); i++) {
if((listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2) < mausX && mausX < (listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2) +d
&& (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2) -d < mausY && mausY < (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2) +d
&& Math.abs(mausY - (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2)) > Math.abs(mausX - (listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2))) {
insel=listInseln.get(i);
return isInside=true;
}
}
return isInside;
}
/**
* Prüft, ob der Mausklick der Klicksektor "West" trifft und gibt die gefundene Insel an.
*
* @param mausX X-Wert der Maus beim Klicken
* @param mausY Y-Wert der Maus beim Klicken
* @return true, wenn Mausklick im Klicksektor West trifft
*/
boolean isInsideWest(int mausX, int mausY) {
boolean isInside=false;
//for(Insel i:listInseln) {
for(int i=0; i<listInseln.size(); i++) {
if((listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2) > mausX && mausX > (listInseln.get(i).getPosInselX()*ABSTAND + DURCHMESSER/2) -d
&& (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2) -d < mausY && mausY < (listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2) +d
&& Math.abs(mausX -(listInseln.get(i).getPosInselX())*ABSTAND + DURCHMESSER/2) > Math.abs(mausY -(listInseln.get(i).getPosInselY()*ABSTAND + DURCHMESSER/2))) {
insel=listInseln.get(i);
return isInside=true;
}
}
return isInside;
}