repaint wird nicht während Druck auf Maustaste ausgeführt.

Crian

Top Contributor
In folgendem kleinen, ausführbaren Beispiel ist das Problem gut zu sehen.

Was passieren soll: Der Kreis soll per Mausklick in ihn hinein und Ziehen der Maus bewegt werden. Beim loslassen des Mausknopfes soll er nicht weiter mit der Maus mitwandern.

Was passiert: Der Kreis wird beim loslassen der Maus an der richtigen neuen Position gezeichnet. Während der Knopf 1 der Maus gedrückt ist, wird nicht neu gezeichnet. Auch die ausgegebene Mausposition wird nicht aktualisiert.

Ich vermute, dass das
Code:
repaint()
im
Code:
MouseMotionAdapter
sich auf die falsche Komponente bezieht.

Java:
package ui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;

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

public class MovePointWithMouse extends JPanel implements MouseListener {

    private static final long serialVersionUID = -7626346552604778427L;

    /** Zugrundeliegender Frame in dem der Spielpanel läuft. */
    private JFrame frame;

    /** X-Koordinate der linken oberen Ecke des Punktes. */
    private int x;

    /** Y-Koordinate der linken oberen Ecke des Punktes. */
    private int y;

    /** Durchmesser des Punktes */
    private int diameter;

    /** Gibt an, ob der Kreis gerade mit der Maus bewegt werden soll. */
    private boolean circleSticksAtMouse;

    /** X-Koordinate der aktuellen Mausposition. */
    private int mouseActualX;

    /** Y-Koordinate der aktuellen Mausposition. */
    private int mouseActualY;


    /**
     * Konstruktor
     *
     * @param width
     *            Breite des Spielpanels.
     * @param height
     *            Höhe des Spielpanels.
     */
    public MovePointWithMouse(int width, int height) {
        circleSticksAtMouse = false;
        diameter = 300;
        setCircleKoordinates(width/2, height/2);

        this.setPreferredSize(new Dimension(width, height));
        this.setBackground(Color.WHITE);
        this.addMouseListener(this);
        this.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(final MouseEvent e) {
                mouseActualX = e.getX();
                mouseActualY = e.getY();
                if (circleSticksAtMouse) {
                    setCircleKoordinates(mouseActualX, mouseActualY);
                }
                repaint();
            }
        });

        frame = new JFrame("Move Point");
        frame.setLocation(100, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);

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

    /**
     * Setzt die Kreiskoordinaten, die sich auf die linke, obere Ecke beziehen,
     * nach Koordinaten, die den Mittelpunkt des Kreises bezeichnen.
     *
     * @param centerX
     *            X-Koordinate des Mittelpunktes
     * @param centerY
     *            Y-Koordinate des Mittelpunktes
     */
    private void setCircleKoordinates(int centerX, int centerY) {
        int radius = diameter/2;
        x = centerX - radius;
        y = centerY - radius;
    }

    /** Auf Panel zeichnen. */
    @Override
    public void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);

        graphics.setColor(Color.BLUE);
        graphics.drawString("Mouseposition: " + mouseActualX + ", "
                + mouseActualY, 10, 20);

        graphics.setColor(Color.BLACK);
        graphics.fillOval(x, y, diameter, diameter);
    }

    @Override
    public void mouseClicked(MouseEvent event) {
    }

    @Override
    public void mouseEntered(MouseEvent event) {
    }

    @Override
    public void mouseExited(MouseEvent event) {
        if (circleSticksAtMouse) {
            circleSticksAtMouse = false;
            Point point = event.getPoint();
            int mouseX = (int) point.getX();
            int mouseY = (int) point.getY();
            setCircleKoordinates(mouseX, mouseY);
            repaint();
        }
    }

    @Override
    public void mousePressed(MouseEvent event) {
        if (event.getButton() == MouseEvent.BUTTON1) {
            if (!circleSticksAtMouse) {
                Point point = event.getPoint();
                int mouseX = (int) point.getX();
                int mouseY = (int) point.getY();
                if (trifftKreis(mouseX, mouseY)) {
                    circleSticksAtMouse = true;
                }
            }
        }
    }

    @Override
    public void mouseReleased(MouseEvent event) {
        if (event.getButton() == MouseEvent.BUTTON1) {
            if (circleSticksAtMouse) {
                circleSticksAtMouse = false;
                Point point = event.getPoint();
                int mouseX = (int) point.getX();
                int mouseY = (int) point.getY();
                setCircleKoordinates(mouseX, mouseY);
                repaint();
            }
        }
    }

    /**
     * Ermittelt, ob die übergebenen Koordinaten im Kreis liegen.
     *
     * @param xx X-Koordinate
     * @param yy Y-Koordinate
     * @return Wahrheitswert.
     */
    private boolean trifftKreis(int xx, int yy) {
        /*
         * Falls der Klick außerhalb des umschließenden Quadrats ist, gleich
         * abbrechen:
         */
        if (xx < x || xx > x + diameter || yy < y || yy > y + diameter) {
            return false;
        }

        /* Mittelpunkt des Kreises bestimmen: */
        int radius = diameter/2;
        int mx = x + radius;
        int my = y + radius;

        /* Nach Pythagoras: */
        int dx = xx-mx; // Vorzeichen egal, da quadriert wird
        int dy = yy-my; // Vorzeichen egal, da quadriert wird
        if (dx*dx + dy*dy <= radius*radius) {
            return true;
        }
        else {
            return false;
        }
    }

    /** Startpunkt des Programms. */
    public static void main(String[] args) {
        new MovePointWithMouse(800, 600);
    }

}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
mouseMoved() ist nur für nicht-geklickte Maus zuständig,
du brauchst noch mouseDragged(),

-----

du solltest dir beim Klick in den Kreis den Versatz zwischen der Mausposition und den Mittelpunkt des Kreises merken,
und bei jedem Neusetzen wieder einbeziehen,
so kannst du den Kreis sauber versetzen, ohne dass dessen Mittelpunkt genau zur Maus springt
(edit: was du bisher wohl noch gar nicht gemerkt hast, nur mit Sprung zum Ende)
 
Zuletzt bearbeitet von einem Moderator:

bERt0r

Top Contributor
Außerdem solltest du die vorsichtig sein, bei Variablennamen. int x und int y gibts bereits in der Klasse Component von der deine Klasse erbt. Das kann zu lustigen Resultaten führen.
 

Marco13

Top Contributor
Diese privaten Variablen sind eigentlich unkritisch. Wenn man dann aber noch ein "getX()" schreibt, bei dem die eigene zurückgegeben wird, haut's ihn natürlich raus...
 

Crian

Top Contributor
Danke!

Mit

Java:
            public void mouseDragged(final MouseEvent e) {
                mouseActualX = e.getX();
                mouseActualY = e.getY();
                if (circleSticksAtMouse) {
                    setCircleKoordinates(mouseActualX, mouseActualY);
                }
                repaint();
            }

war es gelöst. Und ich hab x und y sicherheitshalber umbenannt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O repaint() wird nicht ausgeführt Java Basics - Anfänger-Themen 3
D JPanel repaint() wird nicht gemacht! Java Basics - Anfänger-Themen 7
D Verhindern das repaint beim vergrößern aufgerufen wird Java Basics - Anfänger-Themen 9
D Wenn ich repaint(); mache, flackert es so stark, das man fast nichts erkennen kann. Java Basics - Anfänger-Themen 11
S Repaint() Java Basics - Anfänger-Themen 1
J Erste Schritte Mit repaint() ist Label nicht sichtbar Java Basics - Anfänger-Themen 15
S Repaint() in der Schleife funktioniert nicht immer Java Basics - Anfänger-Themen 5
H Graphics / repaint Java Basics - Anfänger-Themen 8
M Liste mit repaint aktualisieren Java Basics - Anfänger-Themen 1
E Probleme mit repaint() Java Basics - Anfänger-Themen 15
K Erkennt repaint nicht Java Basics - Anfänger-Themen 1
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
1 repaint() Funktion erzeugt Flackern Java Basics - Anfänger-Themen 33
I Anfängerfrage JPanel repaint() Java Basics - Anfänger-Themen 6
A externer repaint Aufruf Java Basics - Anfänger-Themen 9
G Problem mit repaint() Java Basics - Anfänger-Themen 2
J repaint() geht gar nicht; GUI aktualisieren Java Basics - Anfänger-Themen 10
J paint() vs repaint() Java Basics - Anfänger-Themen 3
A Methoden repaint() zeichnet JPanel falsch Java Basics - Anfänger-Themen 3
P [JTable] Problem mit repaint() Java Basics - Anfänger-Themen 2
P Interpreter-Fehler Im for loop funkzioniert repaint nicht :( Java Basics - Anfänger-Themen 4
M repaint() in run-Methode funktioniert nicht Java Basics - Anfänger-Themen 9
O Probleme mit der repaint-Funktion Java Basics - Anfänger-Themen 6
W repaint() ruft paint() nicht auf Java Basics - Anfänger-Themen 9
J repaint() funktioniert nicht wie gewünscht Java Basics - Anfänger-Themen 30
I Hangman CardLayout/repaint? Java Basics - Anfänger-Themen 2
H Variablen Probleme mit repaint() Java Basics - Anfänger-Themen 2
Y im applet malen ohne repaint paint ? Java Basics - Anfänger-Themen 6
J repaint(); launisch ? Java Basics - Anfänger-Themen 3
E Altes Bild bei repaint() löschen? Java Basics - Anfänger-Themen 10
Z Wie repaint() bei Uhr realisieren? Java Basics - Anfänger-Themen 12
N JScrollPane repaint(); geht nicht Java Basics - Anfänger-Themen 4
I repaint bei jpanel Java Basics - Anfänger-Themen 10
T repaint wir nicht mehr geöffnet! Java Basics - Anfänger-Themen 38
T Canvas aktualisierung mit repaint Java Basics - Anfänger-Themen 5
C GUI aktualisieren: repaint, validate, Fenstergröße ändern bringt nichts Java Basics - Anfänger-Themen 13
Antoras Swing repaint und Nullpointer Java Basics - Anfänger-Themen 6
S problem mit repaint() in Thread Java Basics - Anfänger-Themen 6
Antoras swing und repaint-Ersatz Java Basics - Anfänger-Themen 8
G Automatischer repaint bei Swing so wie bei AWT? Java Basics - Anfänger-Themen 7
M Problem mit repaint Java Basics - Anfänger-Themen 2
R Probleme beim Repaint Java Basics - Anfänger-Themen 3
T repaint einer komponente Java Basics - Anfänger-Themen 2
E repaint() aufrufen Java Basics - Anfänger-Themen 12
F paintComponent mit repaint() aufrufen Java Basics - Anfänger-Themen 27
kulturfenster Probleme mit repaint() Java Basics - Anfänger-Themen 2
S SelectionListener + repaint().Verständnisproblem ;) Java Basics - Anfänger-Themen 7
K Repaint() in Methode Java Basics - Anfänger-Themen 13
G Frage zu repaint() Java Basics - Anfänger-Themen 5
B Problem mit repaint() Java Basics - Anfänger-Themen 8
V Reihenfolge von Befehlen - hier repaint() zu spät Java Basics - Anfänger-Themen 13
G repaint in paint aufrufen? Java Basics - Anfänger-Themen 9
F repaint() - Methode verzögern lassen? Java Basics - Anfänger-Themen 3
I Erst repaint() dann zeichnen? Java Basics - Anfänger-Themen 6
D von paint() und repaint() im Applet Java Basics - Anfänger-Themen 4
J probleme mit repaint Java Basics - Anfänger-Themen 2
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
Oneixee5 Maven Plugin wird 2 mal ausgeführt Java Basics - Anfänger-Themen 10
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
L Switch-Case Multiplikation wird nicht ausgegeben Java Basics - Anfänger-Themen 1
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
M Rechteck wird nicht angezeigt Java Basics - Anfänger-Themen 3
B Bungeecord | ProxiedPlayer wird nicht in ArrayList hinzugefügt Java Basics - Anfänger-Themen 1
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
K Präzedenregeln in Java sagen, dass +expr und -expr vor + von Addition und - von Addition stehen, warum wird dann z. B. a+b als eine Addition ausgeführ Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben