"PaintComponent" und "MouseListener" einbinden

GRAZZ0R

Mitglied
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...

Java:
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.

Java:
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.

Java:
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! :)
 

Joose

Top Contributor
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

Mitglied
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

Bekanntes Mitglied
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:

Java:
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.

Java:
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.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B paintComponent Methode Spiele- und Multimedia-Programmierung 4
A paintComponent in JPanel in JFrame Spiele- und Multimedia-Programmierung 7
S PaintComponent zeichnet in falscher reihenfolge Spiele- und Multimedia-Programmierung 8
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
R BufferStrategy vs. paintComponent Spiele- und Multimedia-Programmierung 9
W JOGL bleibt nach display() in PaintArea.paintComponent hängen Spiele- und Multimedia-Programmierung 5
B paintComponent() , Parameter Spiele- und Multimedia-Programmierung 2
A MouseListener ändert nicht das Lable Icon. Spiele- und Multimedia-Programmierung 2
D Probleme mit objekt initializirung mit Mouselistener Spiele- und Multimedia-Programmierung 10
K MouseListener in Java3D Spiele- und Multimedia-Programmierung 3
N Ereignisse mit MouseListener Spiele- und Multimedia-Programmierung 10
N Java3d in Eclipse einbinden Spiele- und Multimedia-Programmierung 4
F Spielprogrammierung , einbinden des Keyboards Spiele- und Multimedia-Programmierung 2
Androbin Grafiken in JAR einbinden Spiele- und Multimedia-Programmierung 3
T Bilder einbinden, bzw. ändern Spiele- und Multimedia-Programmierung 5
G Video-/Livestream einbinden Spiele- und Multimedia-Programmierung 5
D 3ds max dateien in java einbinden, 3d welt Spiele- und Multimedia-Programmierung 9
J Sound einbinden funktioniert nicht Spiele- und Multimedia-Programmierung 13
E GUI+Video einbinden Spiele- und Multimedia-Programmierung 2
K jogl einbinden Spiele- und Multimedia-Programmierung 6
1 Livestream in Java einbinden Spiele- und Multimedia-Programmierung 15
S jogl ins system einbinden Spiele- und Multimedia-Programmierung 3
S Eigenes AudioDevice (Mixer) einbinden Spiele- und Multimedia-Programmierung 3
S 3ds animation einbinden Spiele- und Multimedia-Programmierung 3
J Shape im Branchgraph einbinden ... Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben