# Swing Component draggen



## fischebr (3. Jan 2017)

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:

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

           }


       });

   }

}
```
Ich möchte aber eine komplexere Grafik bewegen, also tausche ich das Rect gegen meine Zeichnung aus:

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

           }


       });

   }

}
```
Was bitte muss ich an meinem Code verändern, damit dieses Objekt bewegt wird?
Vielen Dank!


----------



## Robat (3. Jan 2017)

Dadurch dass es ein JPanel ist kann es gut sein dass du deiner Platte erst den Focus geben musst damit der Listener reagiert.
Das geht mit `setFocusable(true);`

Gruß Robert


----------



## fischebr (3. Jan 2017)

Hallo Robat,
das funktioniert leider nicht. Das Objekt bewegt sich nach wie vor nicht.


----------



## Viktim (3. Jan 2017)

Also in Beispiel 1 fehlt bei mir nur eine Klammer zu hinter der paintComponent Methode.


----------



## Viktim (3. Jan 2017)

Ich glaub du solltest dein Porgramm ganz anders aufziehen, und dein zu Zeichnendes Object in eine eigene Klasse auslagern....


----------



## fischebr (3. Jan 2017)

Hallo Viktim,
Da oben ist nur eine Testklasse, im originalen Programmcode hat mein Objekt eine eigene Klasse. Die Listener sind in einer anderen Klasse, die die GUI zusammensetzt. Das ganze Projekt ist aber zu komplex, um es hier zu posten. Wenn ich das Objekt in meiner Testklasse in Bewegung bringe, kann ich es auch in mein Gesamtprojekt implementieren. 
Am Listener liegt es jedenfalls nicht. Ein einfaches  Objekt lässt sich ja bewegen.


----------



## Viktim (3. Jan 2017)

Hey,
was du auf jeden Fall machen solltest ist, die Listener auf das zu zeichnende Objekt zu legen, dann sparst du dir die ewigen abfragen, ob die Maus auch wirklich über dem Objekt liegen.


----------



## Viktim (3. Jan 2017)

Ich glaube es scheitert an deinem candrag  mach mal eine Konsolenausgabe in die if-Bedinung in der mouseDragged Methode


----------



## fischebr (3. Jan 2017)

Konsolenausgabe habe ich schon gemacht. Mit dem einfachen Rect bekomme ich die Konsolenausgabe, da es sich ja ziehen lässt. Aber da sich mein Objekt "Plate" nicht ziehen lässt, produziert es ja auch keine Konsolenausgabe in der mouseDragged Methode.
Was genau meinst Du mit "Listener auf das zu zeichnende Objekt zu legen"? Sorry, das ist mein erstes Projekt dieser Art.


----------



## Viktim (3. Jan 2017)

Ich habs 

Hier war der Fehler:

```
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, plateX + (r * 60), plateY + (c * 60));
        }

      }

    } catch (Exception e) {
      System.out.print(e);
    }

  }
```


----------



## Viktim (3. Jan 2017)

Ich hab mich die ganze Zeit über gewundert, was du mit plateX und plateY willst, wenn du nie was damit machst 

Also was ich damit meinte, war: dass du den MouseListener(für den Klick) zu dem Objekt, das du verschieben willst hinzufügen solltest, dann must du nicht abfragen, ob das Objekt wirklich getroffen wurde.


----------



## fischebr (3. Jan 2017)

Da könnte der Fehler liegen. Ich habe jetzt mal beide Objekte in das Fenster gezeichnet und die Maus liegt nur auf dem Rect. Wie setze ich das um, dass die Maus auf das andere Objekt gelegt wird?


----------



## Viktim (3. Jan 2017)

ich habs ausprobiert, bei mir klappts, ich post sicherheitshalber mal alles, falls ich noch was anderes geändert hab 

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

public class TEST extends JPanel implements MouseListener, MouseMotionListener {
  private static final long serialVersionUID = 1L;

  // 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 TEST() {
    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(posX + 15, posY + 15, 30, 30);
    g2d.setColor(new Color(242, 203, 130));
    g2d.fillOval(posX + 16, posY + 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, plateX + (r * 60), plateY + (c * 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);

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

    candrag = false;

  }

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

        TEST g2d = new TEST();
        g2d.setPreferredSize(new Dimension(650, 650));

        f.add(g2d);
        f.pack();
        f.setLocation(0, 0);
        f.setVisible(true);

      }

    });

  }

}
```


----------



## Viktim (3. Jan 2017)

fischebr hat gesagt.:


> Wie setze ich das um, dass die Maus auf das andere Objekt gelegt wird?


Also du meintest ja, das in dem "richtigen" Projekt das zu zeichnende Objekt in einer anderen Klasse ist, die könntest du einfach von JPanel erben lassen, auf dein Fenster ein anderes JPanel legen, das ein absolut Layout hat, (setLayout(null))
dann kannst du mithilfe der setBounds-Methode das Objekt, was du bewegen willst einfach damit lenken, und eben da auch den MouseListener drauflegen. Den MouseMotionlistener musst du aber auf der Bühne lassen.


----------



## fischebr (3. Jan 2017)

Vielen, vielen Dank! Es funzt! 
Ich hatte schon mehrfach versucht, plateX und plateY in der Zeichenmethode unterzubringen, gab aber immer Compiler-Error. 
Deswegen hatte ich vorhin hier um Hilfe gerufen.


----------



## Viktim (3. Jan 2017)

jo, hat lange gedauert, aber freut mich, wenn ich dir helfen konnte


----------



## fischebr (3. Jan 2017)

Hey Viktim, kannst Du mir vielleicht noch eine Frage beantworten?
Im Augenblick habe ich der Variable platesize einen festen Wert zugewiesen.
Im eigentlichen Programm erstelle ich verschiedene Größen dieser Platten, so dass Platesize immer die Größe "plate.length x plate[0].length" hat. Kann man diesen Wert so der Variable zuweisen? Ich habe es jetzt noch nicht ausprobiert, aber nachher bist Du vielleicht nicht mehr online.


----------



## Viktim (3. Jan 2017)

Hmm ich hab erstmal ein Meeting, ich probier gleich nochmal rum


----------



## fischebr (3. Jan 2017)

Okay, vielen Dank, das ist riesig nett von dir. Ich schaue dann nachher noch mal rein.


----------



## Viktim (3. Jan 2017)

Eine Frage hab ich vorher noch,wie sollen diese Platten ihre größe verändern? so das jede der 4 Kleinen Platten unterschiedlich groß ist, oder dass alle 4 Teilplatten gleich groß bzw klein sind?
Oder so dass das ganze aus z.B. 9 Platten besteht?


----------



## Viktim (3. Jan 2017)

Ich bin jetzt einfachmal davon ausgegangen, das das ganze immer aus 4 gleich großen Vierecken bestehen soll, die aber von mal zu mal unterschiedlich sind.

Dann geht das ganze so:


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

public class TEST extends JPanel implements MouseListener, MouseMotionListener {
  private static final long serialVersionUID = 1L;

  // Plattengröße
  private int platesize = (int) (Math.random() * 100);

  // Plattenkoordinaten
  private int plateX = platesize / 2;
  private int plateY = platesize / 2;

  // 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 TEST() {
    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, platesize, platesize);
    g2d.setColor(new Color(242, 203, 130));
    g2d.fillRect(posX + 1, posY + 1, platesize - 1, platesize - 1);
    g2d.setColor(Color.BLACK);
    g2d.drawOval(posX + platesize / 4, posY + platesize / 4, platesize / 2, platesize / 2);
    g2d.setColor(new Color(242, 203, 130));
    g2d.fillOval(posX + platesize / 4 + 1, posY + platesize / 4 + 1, platesize / 2 - 1, platesize / 2 - 1);
  }

  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, plateX + (r * platesize), plateY + (c * platesize));
        }

      }

    } 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 * 2)) && y >= plateY && y <= (plateY + (platesize * 2))) {
      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);

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

    candrag = false;

  }

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

        TEST g2d = new TEST();
        g2d.setPreferredSize(new Dimension(650, 650));

        f.add(g2d);
        f.pack();
        f.setLocation(0, 0);
        f.setVisible(true);

      }

    });

  }

}
```

Die größe hab ich jetzt einfach immer mit Math.random mit einem zufallswert belegen lassen. (Nur um zu testen obs auch wirklich mit jeder größe klappt )
Müsstest du theoretisch also einfach ändern können.

EDIT:
Ich hoffe das hilft dir, wenn nicht musst du bis morgen warten


----------



## fischebr (3. Jan 2017)

Hallo Viktim, so war es nicht gemeint. Es gibt halt 4 verschiedene Plattengrößen: 6er, 4er, 3er und 2er, die halt rechteckig bzw. quadratisch und je 4 oder 5 Stück sind. Auf dem Spielfeld sieht es im Augenblick so aus (die bunten Hintergründe habe ich im Augenblick nur gemacht, um einigermaßen die Übersicht behalten zu können):
 
Die Platten sollen auf das 10x10 Spielfeld verschoben werden, so dass ein dynamisches Spielfeld erstellt wird (Es werden nicht alle Felder belegt). Die Murmeln werden dann im Wechsel von den beiden Spielern auf das so entstandene Spielfeld gelegt. 
Ich habe jetzt mal versucht, den Listener in meinen Code zu implementieren. Funktioniert im Augenblick nicht, ich denke wegen der festen Variablen.
Erst einmal meine Klasse "Plate":

```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JPanel;

import Model.EFieldStateMarble;
import Model.EFieldStatePlate;

public class Plate extends JPanel {

   // 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
           }

       }
   }

   // 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;
   }

   @Override
   protected void paintComponent(Graphics g) {
       super.paintComponent(g);
       Graphics2D g2d = (Graphics2D) g;
       g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

       drawPlate(g2d, 20, 15);

   }

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

   }
}
```
Die Klasse, die die Oberfläche zusammensetzen soll:

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

import Components.BlackPlayer;
import Components.Board;
import Components.Plate;
import Components.RedPlayer;
import Model.EFieldStateMarble;
import Model.EFieldStatePlate;

public class BoardEditorUI extends JDialog {
   
   private JLabel lblHeader;
    private JPanel pnlBoard;
    private JPanel pnlPlayerBlack;
    private JPanel pnlPlayerRed;
    private JPanel pnlBottom;
    private JPanel pnlSpeichern;
    private JPanel pnlPlate;
    private JPanel pnlBeenden;
    private JButton btnSpielfeldSpeichern;
    private JButton btnBeenden;
    private Board board;
    private BlackPlayer blackPlayer;
    private RedPlayer redPlayer;
    private JPanel pnlPlate6;
    private JPanel pnlPlate4;
    private JPanel pnlPlate3;
    private JPanel pnlPlate2;
    private Plate plateB6;
    private Plate plateC6;
    private Plate plateD6;
    private Plate plateE6;
    private Plate plateF4;
    private Plate plateG4;
    private Plate plateH4;
    private Plate plateI4;
    private Plate plateJ4;
    private Plate plateK3;
    private Plate plateL3;
    private Plate plateM3;
    private Plate plateN3;
    private Plate plateO2;
   private Plate plateP2;
    private Plate plateQ2;
    private Plate plateR2;

   
    public BoardEditorUI() {
       
       this.setTitle("Kulami - Brigitte Fischer         Mtr.-Nr. 8958181");
       this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
       
       createWidgets();
       addWidgets();
       setupInteractions();
       
       this.setPreferredSize(new Dimension(1030, 900));
       this.setLocationRelativeTo(null);
       this.pack();
       
       // anonyme Klasse erbt von der Klasse WindowAdapter
       WindowListener winListener = new WindowAdapter() {                           
           @Override
           public void windowClosing(WindowEvent e) {
               int antwort = JOptionPane.showConfirmDialog(BoardEditorUI.this,
                       "Wollen Sie das Programm wirklich beenden?",
                       "Wirklich beenden?", JOptionPane.YES_NO_OPTION);
   
               if (antwort == JOptionPane.YES_OPTION) {
                   System.exit(0);
               }
   
           }
       }; // kein Objekt mehr möglich, weil kein Klassenname existiert, Erhöhung der Datenkapselung, einfacherer Code, leichter Zugriff auf Klassenvariablen
   
       this.addWindowListener(winListener);
   }


    private void setupInteractions() {
       plateB6.addMouseMotionListener(new PlateDragged());
       pnlPlate.addMouseListener(new PlateTurned());
       pnlPlayerBlack.addMouseListener(new MarbleSet());
       pnlPlayerRed.addMouseListener(new MarbleSet());
       
    }

    private void addWidgets() {

        getContentPane().setLayout(new BorderLayout(5, 5));
        getContentPane().setBackground(Color.WHITE);
        getContentPane().add(BorderLayout.PAGE_START, lblHeader);
        getContentPane().add(BorderLayout.CENTER, pnlBoard);
        getContentPane().add(BorderLayout.LINE_START, pnlPlayerBlack);
        getContentPane().add(BorderLayout.LINE_END, pnlPlayerRed);
        getContentPane().add(BorderLayout.PAGE_END, pnlBottom);
       
        pnlBoard.add(BorderLayout.CENTER, board);
       
        pnlPlayerBlack.add(BorderLayout.CENTER, blackPlayer);
       
        pnlPlayerRed.add(BorderLayout.CENTER, redPlayer);
       
        pnlBottom.add(BorderLayout.LINE_START, pnlSpeichern);
        pnlBottom.add(BorderLayout.CENTER, pnlPlate);
        pnlBottom.add(BorderLayout.LINE_END, pnlBeenden);
       
        pnlSpeichern.add(btnSpielfeldSpeichern);
       
        pnlPlate.add(pnlPlate6);
        pnlPlate.add(pnlPlate4);
        pnlPlate.add(pnlPlate3);
        pnlPlate.add(pnlPlate2);
       
        pnlPlate6.add(plateB6);
        pnlPlate6.add(plateC6);
        pnlPlate6.add(plateD6);
        pnlPlate6.add(plateE6);
       
        pnlPlate4.add(plateF4);
        pnlPlate4.add(plateG4);
        pnlPlate4.add(plateH4);
        pnlPlate4.add(plateI4);
        pnlPlate4.add(plateJ4);
       
        pnlPlate3.add(plateK3);
        pnlPlate3.add(plateL3);
        pnlPlate3.add(plateM3);
        pnlPlate3.add(plateN3);
       
        pnlPlate2.add(plateO2);
        pnlPlate2.add(plateP2);
        pnlPlate2.add(plateQ2);
        pnlPlate2.add(plateR2);
       
        pnlBeenden.add(btnBeenden);

       
       
       
    }

    private void createWidgets() {
       
       board = new Board();
        board.setBackground(Color.WHITE);
        board.setPreferredSize(new Dimension(601, 601));
       
        plateB6 = new Plate(2, 3, EFieldStatePlate.B6, EFieldStateMarble.EMPTY);
        plateC6 = new Plate(2, 3, EFieldStatePlate.C6, EFieldStateMarble.EMPTY);
        plateD6 = new Plate(2, 3, EFieldStatePlate.D6, EFieldStateMarble.EMPTY);
        plateE6 = new Plate(2, 3, EFieldStatePlate.E6, EFieldStateMarble.EMPTY);
       
        plateF4 = new Plate(2, 2, EFieldStatePlate.F4, EFieldStateMarble.EMPTY);
        plateG4 = new Plate(2, 2, EFieldStatePlate.G4, EFieldStateMarble.EMPTY);
        plateH4 = new Plate(2, 2, EFieldStatePlate.H4, EFieldStateMarble.EMPTY);
        plateI4 = new Plate(2, 2, EFieldStatePlate.I4, EFieldStateMarble.EMPTY);
        plateJ4 = new Plate(2, 2, EFieldStatePlate.J4, EFieldStateMarble.EMPTY);
       
        plateK3 = new Plate(1, 3, EFieldStatePlate.K3, EFieldStateMarble.EMPTY);
        plateL3 = new Plate(1, 3, EFieldStatePlate.L3, EFieldStateMarble.EMPTY);
        plateM3 = new Plate(1, 3, EFieldStatePlate.M3, EFieldStateMarble.EMPTY);
        plateN3 = new Plate(1, 3, EFieldStatePlate.N3, EFieldStateMarble.EMPTY);
       
        plateO2 = new Plate(1, 2, EFieldStatePlate.O2, EFieldStateMarble.EMPTY);
        plateP2 = new Plate(1, 2, EFieldStatePlate.P2, EFieldStateMarble.EMPTY);
        plateQ2 = new Plate(1, 2, EFieldStatePlate.Q2, EFieldStateMarble.EMPTY);
        plateR2 = new Plate(1, 2, EFieldStatePlate.R2, EFieldStateMarble.EMPTY);
       
   
       
       blackPlayer = new BlackPlayer();
       blackPlayer.setBackground(Color.WHITE);
       blackPlayer.setPreferredSize(new Dimension(150, 350));
       
       redPlayer = new RedPlayer();
       redPlayer.setBackground(Color.WHITE);
       redPlayer.setPreferredSize(new Dimension(150, 350));
       
        lblHeader = new JLabel("Kulami-Spielfeld");
        lblHeader.setBackground(Color.WHITE);
        lblHeader.setFont(lblHeader.getFont().deriveFont(Font.BOLD + Font.ITALIC, 30));
        lblHeader.setForeground(new Color(112, 132, 163));
        lblHeader.setHorizontalAlignment(SwingConstants.CENTER);
       
        pnlBoard = new JPanel();
        pnlBoard.setLayout(new BorderLayout(5, 5));
        pnlBoard.setBackground(Color.WHITE);
        pnlBoard.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
       
        pnlPlayerBlack = new JPanel();
        pnlPlayerBlack.setLayout(new BorderLayout(5, 5));
        pnlPlayerBlack.setBackground(Color.WHITE);
        pnlPlayerBlack.setBorder(BorderFactory.createEmptyBorder(50, 20, 10, 10));
       
        pnlPlayerRed = new JPanel();
        pnlPlayerRed.setLayout(new BorderLayout(5, 5));
        pnlPlayerRed.setBackground(Color.WHITE);
        pnlPlayerRed.setBorder(BorderFactory.createEmptyBorder(50, 10, 10, 20));
       
        pnlBottom = new JPanel();
        pnlBottom.setLayout(new BorderLayout(5, 5));
        pnlBottom.setBackground(Color.BLUE);
       
        pnlSpeichern = new JPanel();
        pnlSpeichern.setBackground(Color.CYAN);
       
        pnlPlate = new JPanel();
        pnlPlate.setLayout(new GridLayout(1, 4));
        pnlPlate.setBackground(Color.WHITE);
        pnlPlate.setPreferredSize(new Dimension(300, 150));
       
        pnlPlate6 = new JPanel();
        pnlPlate6.setLayout(new BorderLayout(5, 5));
        pnlPlate6.setBackground(new Color(125, 169, 145));
        pnlPlate6.setPreferredSize(new Dimension(100, 150));
       
        pnlPlate4 = new JPanel();
        pnlPlate4.setLayout(new BorderLayout(5, 5));
        pnlPlate4.setBackground(new Color(146, 174, 198));
        pnlPlate4.setPreferredSize(new Dimension(50, 150));
       
        pnlPlate3 = new JPanel();
        pnlPlate3.setLayout(new BorderLayout(5, 5));
        pnlPlate3.setBackground(new Color(139, 178, 112));
        pnlPlate3.setPreferredSize(new Dimension(100, 150));
       
        pnlPlate2 = new JPanel();
        pnlPlate2.setLayout(new BorderLayout(5, 5));
        pnlPlate2.setBackground(new Color(185, 159, 198));
        pnlPlate2.setPreferredSize(new Dimension(50, 150));
       
        pnlBeenden = new JPanel();
        pnlBeenden.setBackground(Color.MAGENTA);
       
        btnSpielfeldSpeichern = new JButton("speichern");
        btnSpielfeldSpeichern.setAlignmentX(LEFT_ALIGNMENT);
       
        btnBeenden = new JButton("beenden");
        btnBeenden.setAlignmentX(RIGHT_ALIGNMENT);
       
    }
   
    public class PlateTurned implements MouseListener {

       @Override
       public void mouseClicked(MouseEvent arg0) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseEntered(MouseEvent arg0) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseExited(MouseEvent arg0) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mousePressed(MouseEvent mp) {
           
           SwingUtilities.isRightMouseButton(mp);
//           turnPlate();
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseReleased(MouseEvent arg0) {
           // TODO Auto-generated method stub

       }

    }
   
    private class PlateDragged implements MouseListener, MouseMotionListener {
       
       //Plattengröße
       int platesize = 120;
       
       //Plattenkoordinaten
       int plateX = 0;
       int plateY = 0;
       
       //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 mmp) {
           
           new Thread() {
               @Override
               public void run() {
                   int x = mmp.getX();
                   int y = mmp.getY();
                   
                   if (x >= plateX && x <= (plateX + platesize) && y >= plateY && y <= (plateY + platesize)) {
                       
                       candrag = true;
                       dragFromX = x - plateX;
                       dragFromY = y - plateY;
                   }
                   else {
                       candrag = false;
                   }
               }
           }.start();
           
       }

       @Override
       public void mouseDragged(MouseEvent mmd) {
           
           new Thread() {
               @Override
               public void run() {
                   int x = mmd.getX();
                   int y = mmd.getY();
                   
                   if (x >= plateX && x <= (plateX + platesize) && y >= plateY && y <= (plateY + platesize)) {
                       
                       candrag = true;
                       dragFromX = x - plateX;
                       dragFromY = y - plateY;
                   }
                   else {
                       candrag = false;
                   }
               }
           }.start();

       }
       
       public void mouseExited(MouseEvent mme) {
           
           candrag = false;
           
       }
       
       @Override
       public void mouseReleased(MouseEvent e) {
           // TODO: Platte muss in das Spielfeld gezeichnet werden
       }

       
       public void mouseMoved(MouseEvent me) {}
       public void mouseClicked(MouseEvent e) {}
       public void mouseEntered(MouseEvent e) {}

       

    }
   
   
    public class MarbleSet implements MouseListener {

       @Override
       public void mouseClicked(MouseEvent e) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseEntered(MouseEvent e) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseExited(MouseEvent e) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mousePressed(MouseEvent e) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseReleased(MouseEvent e) {
           // TODO Auto-generated method stub

       }

    }

}
```
Ich habe dem MouseMotionListener erst einmal der ersten 6er Platte mit dem Namen "PlateB6" zugewiesen. Jetzt probiere ich, wie ich die Variablen verallgemeinern kann.


----------



## Viktim (4. Jan 2017)

Ich sag ja ich wusste nicht genau, wie du das haben willst 

Willst du das erstmal alleine Probieren?


----------



## fischebr (4. Jan 2017)

Hallo Viktim,
ja ich möchte es erst einmal alleine probieren und melde mich dann wieder.


----------



## fischebr (4. Jan 2017)

Hallo Viktim,
das ist doch wieder komplexer, als ich gedacht habe.
Ich habe jetzt meiner Platte einfach zwei Größenwerte "platesizeX" und "platesizeY" zugewiesen, was auch in der Testklasse mit Zuweisung fester Werte funktioniert.

```
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 platesizeX = 120;
   private int platesizeY = 180;
   
   //Plattenkoordinaten
   private int plateX = 60;
   private int plateY = 60;
   
   //Position, von der die Maus die Platte zieht
   private int dragFromX = 0;
   private int dragFromY = 0;
   
   //bei "true" kann die Platte nach Mausklick gezogen werden
   private boolean candrag = false;
   

   public PlateTest() {
       this.setFocusable(true);
       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);



       drawPlate(g2d, 2, 3);
       

   }

   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, plateX + c*60, plateY + 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 + platesizeY) && y >= plateY && y <= (plateY + platesizeX)) {
           
           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() - platesizeY);
           
           plateY = Math.max(plateY, 0);
           plateY = Math.min(plateY, getHeight() - platesizeX);
           this.repaint();
           System.out.println("Hallo");
       }
       
   }

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

           }


       });

   }

}
```
In meiner Klasse "BordEditorUI" möchte ich diesen beiden Variablen gerne die Größen meiner Platten mit "plate.length" und "plate[0].length" zuweisen. Die BordEditorUI kennt "plate" aber nicht, weil ich ja nur die Objekte erzeugt habe, die ich auch benötige, sprich plateB6 - plateR2. Wie bringe ich diese Klasse denn jetzt dazu, auf die "Plate" zuzugreifen?
korrigierte BordEditorUI:

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

import Components.BlackPlayer;
import Components.Board;
import Components.Plate;
import Components.RedPlayer;
import Model.EFieldStateMarble;
import Model.EFieldStatePlate;

public class BoardEditorUI extends JDialog {
   
   private JLabel lblHeader;
    private JPanel pnlBoard;
    private JPanel pnlPlayerBlack;
    private JPanel pnlPlayerRed;
    private JPanel pnlBottom;
    private JPanel pnlSpeichern;
    private JPanel pnlPlate;
    private JPanel pnlBeenden;
    private JButton btnSpielfeldSpeichern;
    private JButton btnBeenden;
    private Board board;
    private BlackPlayer blackPlayer;
    private RedPlayer redPlayer;
    private JPanel pnlPlate6;
    private JPanel pnlPlate4;
    private JPanel pnlPlate3;
    private JPanel pnlPlate2;
    private Plate plateB6;
    private Plate plateC6;
    private Plate plateD6;
    private Plate plateE6;
    private Plate plateF4;
    private Plate plateG4;
    private Plate plateH4;
    private Plate plateI4;
    private Plate plateJ4;
    private Plate plateK3;
    private Plate plateL3;
    private Plate plateM3;
    private Plate plateN3;
    private Plate plateO2;
   private Plate plateP2;
    private Plate plateQ2;
    private Plate plateR2;
//    private Plate plate[][];

   
    public BoardEditorUI() {
       
       this.setTitle("Kulami - Brigitte Fischer         Mtr.-Nr. 8958181");
       this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
       
       createWidgets();
       addWidgets();
       setupInteractions();
       
       this.setPreferredSize(new Dimension(1030, 900));
       this.setLocationRelativeTo(null);
       this.pack();
       
       // anonyme Klasse erbt von der Klasse WindowAdapter
       WindowListener winListener = new WindowAdapter() {                           
           @Override
           public void windowClosing(WindowEvent e) {
               int antwort = JOptionPane.showConfirmDialog(BoardEditorUI.this,
                       "Wollen Sie das Programm wirklich beenden?",
                       "Wirklich beenden?", JOptionPane.YES_NO_OPTION);
   
               if (antwort == JOptionPane.YES_OPTION) {
                   System.exit(0);
               }
   
           }
       }; // kein Objekt mehr möglich, weil kein Klassenname existiert, Erhöhung der Datenkapselung, einfacherer Code, leichter Zugriff auf Klassenvariablen
   
       this.addWindowListener(winListener);
   }


    private void setupInteractions() {
       plateB6.addMouseMotionListener(new PlateDragged());
       pnlPlate.addMouseListener(new PlateTurned());
       pnlPlayerBlack.addMouseListener(new MarbleSet());
       pnlPlayerRed.addMouseListener(new MarbleSet());
       
    }

    private void addWidgets() {

        getContentPane().setLayout(new BorderLayout(5, 5));
        getContentPane().setBackground(Color.WHITE);
        getContentPane().add(BorderLayout.PAGE_START, lblHeader);
        getContentPane().add(BorderLayout.CENTER, pnlBoard);
        getContentPane().add(BorderLayout.LINE_START, pnlPlayerBlack);
        getContentPane().add(BorderLayout.LINE_END, pnlPlayerRed);
        getContentPane().add(BorderLayout.PAGE_END, pnlBottom);
       
        pnlBoard.add(BorderLayout.CENTER, board);
       
        pnlPlayerBlack.add(BorderLayout.CENTER, blackPlayer);
       
        pnlPlayerRed.add(BorderLayout.CENTER, redPlayer);
       
        pnlBottom.add(BorderLayout.LINE_START, pnlSpeichern);
        pnlBottom.add(BorderLayout.CENTER, pnlPlate);
        pnlBottom.add(BorderLayout.LINE_END, pnlBeenden);
       
        pnlSpeichern.add(btnSpielfeldSpeichern);
       
        pnlPlate.add(pnlPlate6);
        pnlPlate.add(pnlPlate4);
        pnlPlate.add(pnlPlate3);
        pnlPlate.add(pnlPlate2);
       
        pnlPlate6.add(plateB6);
        pnlPlate6.add(plateC6);
        pnlPlate6.add(plateD6);
        pnlPlate6.add(plateE6);
       
        pnlPlate4.add(plateF4);
        pnlPlate4.add(plateG4);
        pnlPlate4.add(plateH4);
        pnlPlate4.add(plateI4);
        pnlPlate4.add(plateJ4);
       
        pnlPlate3.add(plateK3);
        pnlPlate3.add(plateL3);
        pnlPlate3.add(plateM3);
        pnlPlate3.add(plateN3);
       
        pnlPlate2.add(plateO2);
        pnlPlate2.add(plateP2);
        pnlPlate2.add(plateQ2);
        pnlPlate2.add(plateR2);
       
        pnlBeenden.add(btnBeenden);

       
       
       
    }

    private void createWidgets() {
       
       board = new Board();
        board.setBackground(Color.WHITE);
        board.setPreferredSize(new Dimension(601, 601));
       
        plateB6 = new Plate(2, 3, EFieldStatePlate.B6, EFieldStateMarble.EMPTY);
        plateC6 = new Plate(2, 3, EFieldStatePlate.C6, EFieldStateMarble.EMPTY);
        plateD6 = new Plate(2, 3, EFieldStatePlate.D6, EFieldStateMarble.EMPTY);
        plateE6 = new Plate(2, 3, EFieldStatePlate.E6, EFieldStateMarble.EMPTY);
       
        plateF4 = new Plate(2, 2, EFieldStatePlate.F4, EFieldStateMarble.EMPTY);
        plateG4 = new Plate(2, 2, EFieldStatePlate.G4, EFieldStateMarble.EMPTY);
        plateH4 = new Plate(2, 2, EFieldStatePlate.H4, EFieldStateMarble.EMPTY);
        plateI4 = new Plate(2, 2, EFieldStatePlate.I4, EFieldStateMarble.EMPTY);
        plateJ4 = new Plate(2, 2, EFieldStatePlate.J4, EFieldStateMarble.EMPTY);
       
        plateK3 = new Plate(1, 3, EFieldStatePlate.K3, EFieldStateMarble.EMPTY);
        plateL3 = new Plate(1, 3, EFieldStatePlate.L3, EFieldStateMarble.EMPTY);
        plateM3 = new Plate(1, 3, EFieldStatePlate.M3, EFieldStateMarble.EMPTY);
        plateN3 = new Plate(1, 3, EFieldStatePlate.N3, EFieldStateMarble.EMPTY);
       
        plateO2 = new Plate(1, 2, EFieldStatePlate.O2, EFieldStateMarble.EMPTY);
        plateP2 = new Plate(1, 2, EFieldStatePlate.P2, EFieldStateMarble.EMPTY);
        plateQ2 = new Plate(1, 2, EFieldStatePlate.Q2, EFieldStateMarble.EMPTY);
        plateR2 = new Plate(1, 2, EFieldStatePlate.R2, EFieldStateMarble.EMPTY);
       
   
       
       blackPlayer = new BlackPlayer();
       blackPlayer.setBackground(Color.WHITE);
       blackPlayer.setPreferredSize(new Dimension(150, 350));
       
       redPlayer = new RedPlayer();
       redPlayer.setBackground(Color.WHITE);
       redPlayer.setPreferredSize(new Dimension(150, 350));
       
        lblHeader = new JLabel("Kulami-Spielfeld");
        lblHeader.setBackground(Color.WHITE);
        lblHeader.setFont(lblHeader.getFont().deriveFont(Font.BOLD + Font.ITALIC, 30));
        lblHeader.setForeground(new Color(112, 132, 163));
        lblHeader.setHorizontalAlignment(SwingConstants.CENTER);
       
        pnlBoard = new JPanel();
        pnlBoard.setLayout(new BorderLayout(5, 5));
        pnlBoard.setBackground(Color.WHITE);
        pnlBoard.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
       
        pnlPlayerBlack = new JPanel();
        pnlPlayerBlack.setLayout(new BorderLayout(5, 5));
        pnlPlayerBlack.setBackground(Color.WHITE);
        pnlPlayerBlack.setBorder(BorderFactory.createEmptyBorder(50, 20, 10, 10));
       
        pnlPlayerRed = new JPanel();
        pnlPlayerRed.setLayout(new BorderLayout(5, 5));
        pnlPlayerRed.setBackground(Color.WHITE);
        pnlPlayerRed.setBorder(BorderFactory.createEmptyBorder(50, 10, 10, 20));
       
        pnlBottom = new JPanel();
        pnlBottom.setLayout(new BorderLayout(5, 5));
        pnlBottom.setBackground(Color.BLUE);
       
        pnlSpeichern = new JPanel();
        pnlSpeichern.setBackground(Color.CYAN);
       
        pnlPlate = new JPanel();
        pnlPlate.setLayout(new GridLayout(1, 4));
        pnlPlate.setBackground(Color.WHITE);
        pnlPlate.setPreferredSize(new Dimension(300, 150));
       
        pnlPlate6 = new JPanel();
        pnlPlate6.setLayout(new BorderLayout(5, 5));
        pnlPlate6.setBackground(new Color(125, 169, 145));
        pnlPlate6.setPreferredSize(new Dimension(100, 150));
       
        pnlPlate4 = new JPanel();
        pnlPlate4.setLayout(new BorderLayout(5, 5));
        pnlPlate4.setBackground(new Color(146, 174, 198));
        pnlPlate4.setPreferredSize(new Dimension(50, 150));
       
        pnlPlate3 = new JPanel();
        pnlPlate3.setLayout(new BorderLayout(5, 5));
        pnlPlate3.setBackground(new Color(139, 178, 112));
        pnlPlate3.setPreferredSize(new Dimension(100, 150));
       
        pnlPlate2 = new JPanel();
        pnlPlate2.setLayout(new BorderLayout(5, 5));
        pnlPlate2.setBackground(new Color(185, 159, 198));
        pnlPlate2.setPreferredSize(new Dimension(50, 150));
       
        pnlBeenden = new JPanel();
        pnlBeenden.setBackground(Color.MAGENTA);
       
        btnSpielfeldSpeichern = new JButton("speichern");
        btnSpielfeldSpeichern.setAlignmentX(LEFT_ALIGNMENT);
       
        btnBeenden = new JButton("beenden");
        btnBeenden.setAlignmentX(RIGHT_ALIGNMENT);
       
    }
   
    public class PlateTurned implements MouseListener {

       @Override
       public void mouseClicked(MouseEvent arg0) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseEntered(MouseEvent arg0) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseExited(MouseEvent arg0) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mousePressed(MouseEvent mp) {
           
           SwingUtilities.isRightMouseButton(mp);
//           turnPlate();
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseReleased(MouseEvent arg0) {
           // TODO Auto-generated method stub

       }

    }
   
    private class PlateDragged implements MouseListener, MouseMotionListener {
       
       //Plattengröße
       int platesizeX = plate.length;
       int platesizeY = plate[0].length;
       
       //Plattenkoordinaten
       int plateX = 0;
       int plateY = 0;
       
       //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 mmp) {
           
           new Thread() {
               @Override
               public void run() {
                   int x = mmp.getX();
                   int y = mmp.getY();
                   
                   if (x >= plateX && x <= (plateX + platesizeY) && y >= plateY && y <= (plateY + platesizeX)) {
                       
                       candrag = true;
                       dragFromX = x - plateX;
                       dragFromY = y - plateY;
                   }
                   else {
                       candrag = false;
                   }
               }
           }.start();
           
       }

       @Override
       public void mouseDragged(MouseEvent mmd) {
           
           new Thread() {
               @Override
               public void run() {
                   if (candrag) {
                       
                       
                       //Plattenposition wechseln
                       plateX = mmd.getX() - dragFromX;
                       plateY = mmd.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);
                       this.repaint();
                       System.out.println("Hallo");
                   }
               }
           }.start();

       }
       
       public void mouseExited(MouseEvent mme) {
           
           candrag = false;
           
       }
       
       @Override
       public void mouseReleased(MouseEvent e) {
           // TODO: Platte muss in das Spielfeld gezeichnet werden
       }

       
       public void mouseMoved(MouseEvent me) {}
       public void mouseClicked(MouseEvent e) {}
       public void mouseEntered(MouseEvent e) {}

       

    }
   
   
    public class MarbleSet implements MouseListener {

       @Override
       public void mouseClicked(MouseEvent e) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseEntered(MouseEvent e) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseExited(MouseEvent e) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mousePressed(MouseEvent e) {
           // TODO Auto-generated method stub

       }

       @Override
       public void mouseReleased(MouseEvent e) {
           // TODO Auto-generated method stub

       }

    }

}
```
Die Klasse rufe ich ganz schlicht auf:

```
import javax.swing.JDialog;
import javax.swing.JFrame;

import Components.Plate;
import Model.EFieldStateMarble;
import Model.EFieldStatePlate;

public class Main {

   public static void main(String[] args) {
//      JFrame mframe = new MainFrameUI();
//      mframe.setVisible(true);
      JDialog bEditor = new BoardEditorUI();
      bEditor.setVisible(true);

   }

}
```
Ist es eigentlich richtig, den MouseListener den Platten zuzuweisen? Oder muss ich den Listener dem JPanel zuweisen auf dem die Platten gezeichnet werden?
Vielen Dank!


----------



## fischebr (4. Jan 2017)

Ich vergaß zu sagen: einfach Variable "plate" zufügen reicht nicht, dann kennt die Klasse "length" nicht, mit Variable "plate[][]" zufügen kennt sie zwar "length", aber "plate" nicht.


----------

