Java Klassen "Graphics" und "MouseEvent" kombinieren

Diskutiere Java Klassen "Graphics" und "MouseEvent" kombinieren im Java Basics - Anfänger-Themen Bereich.
I

iRecordS

Guten Mittag liebes Forum,

ich sitze an einer Aufgabe, wo das Ziel ist, ein Fenster (bei mir über JFrame) mit einem Kreis in der Mitte zu haben, welcher sich in die entgegengesetzte Position bewegt, wo man hin klickt. Also wenn ich das Programme starte ist der Kreis in der Mitte. Klicke ich dann unten links in das Fenster, dann soll der Kreis oben rechts erscheinen usw.

Bis jetzt habe ich es geschafft, ein Fenster zu erzeugen, welches einen Kreis in der Mitte darstellt (siehe Anhang) und wenn ich mit der Maus auf dem Fenster rumklicke, dann werden die Positionen in der Konsole ausgegeben.

Mein Problem ist jetzt, das ich die X und Y Werte zwar speichern kann und diese auch versuche der Klasse "Grafik" zu übergeben, wo mein Kreis gezeichnet wird, dieser allerdings nicht an der neuen Position gezeichnet wird. Ich denke hier mangelt es mir an Verständnis, wie die Klasse "Graphics" von Java wirklich funktioniert.

Meine Hauptklasse:
Code:
package learnFrame;

import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class Fenster extends JFrame {
    private static final long serialVersionUID = 1L;

    public static void main(String[] args) {
        JFrame test = new JFrame();
        
        test.setTitle("Testing Area");
        test.setBounds(20, 20, 600, 300);
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.add(new Grafik(), BorderLayout.CENTER);
        test.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                System.out.println("Maus gedrückt an X = " + x + " und Y = " + y);
                test.add(new Grafik(x, y), BorderLayout.CENTER);
            }
        });
        test.setVisible(true);
    }
}
Meine Grafik-Klasse
Code:
package learnFrame;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;

import javax.swing.JComponent;

public class Grafik extends JComponent {
    private static final long serialVersionUID = 1L;   
    private int x;
    private int y;
    
    public Grafik() {
        this.x = 275;
        this.y = 100;
    }
    
    public Grafik(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    public void paint(Graphics g) {
        Graphics2D graph2 = (Graphics2D)g;
        graph2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        Shape drawCircle = new Ellipse2D.Float(x, y, 50, 50);
        graph2.draw(drawCircle);
    }
}
Bin für jeden Verbesserungs- und Lösungsvorschlag dankbar!

Gruß
iRecordS
 

Anhänge

MoxxiManagarm

MoxxiManagarm

Du brauchst den MouseListener nur in deiner Component, verschiebe ihn dort hin.
 
I

iRecordS

@MoxxiManager Das sagst du so einfach, allerdings weiß ich nicht wohin genau ^^ Habe Ihn jetzt in den Component verschoben, allerdings wird jetzt gar kein Kreis mehr gezeichnet, egal wie ich es drehe. Das klicken wird trotzdem registriert und in den Konsole ausgegeben.

Code:
package learnFrame;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;

import javax.swing.JComponent;

public class Grafik extends JComponent {
    private static final long serialVersionUID = 1L;   

    public void paint(Graphics g) {
        Graphics2D graph2 = (Graphics2D)g;
        graph2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                System.out.println("Maus gedrückt an X = " + x + " und Y = " + y);
                
                Shape drawCircle = new Ellipse2D.Float(x, y, 50, 50);
                graph2.draw(drawCircle);
            }
        });
    }
}
 
mihe7

mihe7

1. überschreibe nicht paint, sondern pantComponent
2. rufe addMouseListener nicht in paint oder paintComponent, sondern im Konstruktor von Grafik (musst Du schreiben) auf.
 
I

iRecordS

@mihe7 Ich hab deine Ratschläge befolgt allerdings verändert der Kreis seine Position trotzdem nicht. Ich denke das liegt daran, dass ich die paintComponent Methode nicht nochmal aufrufe, wüsste aber auch nicht wie, weil ich nicht weiß, woher ich ein Objekt "g" herbekommen soll.

Code:
public class Grafik extends JComponent {
    private static final long serialVersionUID = 1L;  
    private static int x = 275;
    private static int y = 100;
   
    public Grafik() {
        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                System.out.println("Maus gedrückt an X = " + x + " und Y = " + y);
               //paintComponent(g); ???
            }
        });
    }

    public void paintComponent(Graphics g) {
        Graphics2D graph2 = (Graphics2D)g;
        graph2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
               
        Shape drawCircle = new Ellipse2D.Float(x, y, 50, 50);
        graph2.draw(drawCircle);
    }
}
 
MoxxiManagarm

MoxxiManagarm

Das sagst du so einfach, allerdings weiß ich nicht wohin genau ^^
Ich meinte das etwa so:
Java:
public class GraphicLauncher {

    public GraphicLauncher() {
        JFrame frame = new JFrame();

        frame.setTitle("Testing Area");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new Graphic(), BorderLayout.CENTER);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new GraphicLauncher();
    }

    private class Graphic extends JComponent {
        private static final int WIDTH = 600;
        private static final int HEIGHT = 300;
        private static final int RADIUS = 25;

        Point clicked;

        protected Graphic() {
            setPreferredSize(new Dimension(WIDTH, HEIGHT));

            clicked = new Point(WIDTH / 2, HEIGHT / 2);

            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    clicked = e.getPoint();
                    repaint();
                }
            });
        }

        @Override
        public void paintComponent(Graphics g) {
            g.drawOval(clicked.x - RADIUS, clicked.y - RADIUS, RADIUS * 2, RADIUS * 2);
        }
    }
}
Das Beispiel zeichnet den Kreis dorthin, wo geklickt wurde. Du musst nur für deinen Fall noch die entgegensetzte Seite berechnen.
 
mihe7

mihe7

weil ich nicht weiß, woher ich ein Objekt "g" herbekommen soll.
Du brauchst kein Graphics-Objekt, da die Methode paint bzw. paintComponent vom Framework aufgerufen wird, wenn ein Neuzeichnen der Komponente notwendig wird. Alles, was Du tun musst, ist das Framework davon zu überzeigen, dass es die Komponente zeichnen soll, das erreichst Du mit repaint();
 
I

iRecordS

Ich hab jetzt einfach mal das Programm von @MoxxiManagarm genommen und versuch das erstmal zu verstehen. Sind relativ viele Befehle drin die ich nicht kenne. Danach versuche ich das für mich umzusetzen und sollte es etwas geben melde ich mich wieder, bis hier hin, danke für eure große Hilfe!
 
Thema: 

Java Klassen "Graphics" und "MouseEvent" kombinieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben