# "PaintComponent" und "MouseListener" einbinden



## GRAZZ0R (10. Apr 2016)

Hallo liebe Community,
ich bin recht neu in Jave und programmiere ein kleines Spiel. Da Java ja Objekorientiert ist, will ich mehrere Klassen verwenden und diese miteinander verbinden. Ich weiss aber nicht genau, wei ich die PaintComponent Methode richtig einbinde und arin gezeichente Elemente mit MouseListener ansteuere...


```
import javax.swing.JFrame;

public class Starte_Anwendung {
    public static void main(String args[]){
       
        JFrame frame = new GUI();
       
        frame.setTitle("Mensch ärger dich nicht - Digital Deluxe Edition");
        frame.setVisible(true);
        frame.setSize(660, 750);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
    }

}
```

Das ist Starte_Anwendung Klasse. Hier wird bei mir das JFrame gebildet und es enthält eine main-Methode.


```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class GUI extends JFrame {

    private JPanel panel_haupt;
   
    public GUI(){
        super();
  
        panel_haupt = new JPanel(new BorderLayout());
        add(panel_haupt);

        panel_leiste.add(wuerfeln);
        panel_leiste.add(label);
       
    }
   
    public void paintComponent(Graphics g){
        g.fillRect(10, 10, 100, 100);
    }
}
```

Das ist die GUI Klasse, wo bei mir JButtons, JLabel usw. sich befinden werden. Ich habe hier das unnötige gelöscht. (Hier im Forum). Hier auf JPanel will ich später meine Objekte zeichen.


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

public class Feld_StartHome {
   
    Color farbe;
   
    public Feld_StartHome(Color cfarbe){
        cfarbe = farbe;
    }
   
    public void male_feldStartHome(Graphics fsh){
       
        Graphics2D g2d = (Graphics2D) fsh;
        g2d.setStroke(new BasicStroke(3));
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
       
        fsh.setColor(farbe);
        fsh.fillOval(3, 3, 44, 44);
        fsh.setColor(Color.black);
        fsh.drawOval(3, 3, 44, 44);
    }
}
```

Hier ist mein Bauplan für den Kreis. Der Name der Klasse isttwas seltsam, hat aber seine Gründe.

Nun, wo muss ich denn eigentlich die PaintComponent reinmachen? Es sollen später mehrere Objekte (Kreise, Dreiecke...) gezeichnet und mit der Maus angesprochen werden. Muss ich dafür eine eigene Klasse erstellen, oder kann ich das irgendwie in die GUI reinmachen (Paint-methode)? Wenn es möglich ist, dann wie? 

Mein nächstes Problem ist der Mouselistener. Ich weiss nichtgenau wohin ich diesen Implemintieren muss, damit ich diese gezeichneten Objekte ansprechen kann. Später soll eine Klasse "Steuerung" dazukommen, damit ich dort diese MouseListener Befehle bestimmen kann.

Das ist ein Spiel, womit ich haupsächlich meine Java Kenntnisse erweiter will um später besser zu werden. Ich hoffe ihr könnt mir etwas helfen!


----------



## GRAZZ0R (12. Apr 2016)

Kann mir hier etwa keiner weiterhelfen?


----------



## Joose (12. Apr 2016)

Kenne mich beim Zeichnen usw. nicht so gut aus, aber sollte doch reichen in der paintComponent Methode ein Objekt von deiner Klasse "Feld_StartHome" zu erzeugen und die entsprechende Methode aufzurufen -> "male_feldStartHome".
Ob das aber die optimale bzw. richtige Variante ist dein Vorhaben umzusetzen kann ich dir nich sagen.

Anmerkungen zu deinem Code:
Bitte vermeide "_" in Namen von Klassen, Attributen, Methoden und Variablen. Das einzige was "_" enthalten sollte wären Konstanten.
Verwende stattdessen die übliche lowerCamelCase- (für Parameter, Attribute, Variablen, Methoden) oder UpperCamelCase-Schreibweise (für Klassen).
Der Konstruktor deiner "Feld_StartHome" Klasse ist falsch, du weißt dem Parameter den Wert des Instanzattribut zu.


----------



## GRAZZ0R (12. Apr 2016)

Erstmal danke für deine Antwort 
Ich werde es mal ausprobieren und dann gelich eine Rückmeldung abgeben.

Danke für die Information der Schreibweise. Ich werde es zur Kentniss nehmen und vorerst den Code "korrigieren" 

Funktioniret das so nicht? Meine Überlegung wat, so die Farbe wechseln zu können...


----------



## RalleYTN (22. Apr 2016)

kleiner tipp. verwende nicht die paint methoden der JFrame Klasse. wenn du in einem Loop den JFrame neuzeichnest kann das zu einem Flackern auf manchen PCs führen.

versuch eher sowas:


```
public class Canvas extends JPanel {

    public static final Font DEFAULT_FONT = new Font(Font.MONOSPACED, Font.PLAIN, 16);

    public Canvas() {
        this.setFocusable(true);

        // am besten hier die Listener zum Canvas hinzufügen
    }

    @Override
    public void paintComponent(Graphics graphics) {

        super.paintComponent(graphics);

        graphics.setColor(Color.BLACK);
        graphics.fillRect(0, 0, this.getWidth(), this.getHeight());
        graphics.setColor(Color.WHITE);
        graphics.setFont(Canvas.DEFAULT_FONT);

        // hier alles selber zeichnen.
    }
}
```

So würde man das ganze dann implementieren.


```
Canvas canvas = new Canvas();
JFrame frame = new JFrame("Beispiel");
// ganz viele setters
frame.setContentPane(canvas);
frame.setVisible(true);

new Thread(new Runnable() {

    @Override
    public void run() {

        try {

            while(true) {

                // Berechnungen fürs Spiel
                canvas.repaint();
                Thread.sleep(15); // damit dein PC nicht explodiert.
            }

        } catch(InterruptedException exception) {

        }
    }

}).start();
```

Bei einem Listener würde ich dir empfehlen für die Dinge die man Selektieren kann die Größe und Position in einem Rectangle Objekt zu speichern. Dann verwende Den MouseMotionListener. frage ab ob die aktuelle Kursorposition größer als x und kleiner als (x + width) und größer als y und kleiner als (y + height) ist. wenn alle bedingungen zutreffen hältst du den Kursor direkt über deinem selektierbaren Objekt. das gehört in die mouseMoved methode. wenn du dinge verschieben willst, dann musst du die Methode mouseDragged verwenden.


----------

