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

C

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

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

Marco13

Gesperrter Benutzer
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...
 
C

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
C Methodenrückgabe wird in der main nicht berücksichtigt Java Basics - Anfänger-Themen 2
X compareTo Methode wird ignoriert Java Basics - Anfänger-Themen 7
kodela Hauptklasse wird nicht gefunden Java Basics - Anfänger-Themen 3
H Befehl wird nicht ausgeführt - System.out.println Java Basics - Anfänger-Themen 3
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
P Bedingung in Schleife wird nicht ausgeführt Java Basics - Anfänger-Themen 5
P Variablen HttpResponse.getBody() wird automatisch org.json Object und kann nicht zu json.simple Object gecastet werden? Java Basics - Anfänger-Themen 7
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
N package wird doppelt im exporer angezeigt Java Basics - Anfänger-Themen 2
N Bedinugng If-Abfrage wird nie erfüllt Java Basics - Anfänger-Themen 4
M Else wird nicht ausgeführt. Java Basics - Anfänger-Themen 5
H Wie wird ein String intern gespeichert? Java Basics - Anfänger-Themen 10
A char array wird überschrieben Java Basics - Anfänger-Themen 6
E Methoden Action Event wird nicht vollständig ausgeführt Java Basics - Anfänger-Themen 3
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
S setContentView(R.Layout.XXX) wird Rot angezeigt Java Basics - Anfänger-Themen 0
C Beispiel-Code mit Pair wird nicht compiliert. Java Basics - Anfänger-Themen 8
S Integer Wert wird nicht übernommen Java Basics - Anfänger-Themen 2
J Int wird als Null ausgegeben Java Basics - Anfänger-Themen 8
F Switch case wird als char nicht erkannt.... Java Basics - Anfänger-Themen 6
S for-Schleife wird ignoriert Java Basics - Anfänger-Themen 15
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
M BorderLayout, 2Panels, EAST wird nicht angezeigt ?? Java Basics - Anfänger-Themen 2
K File wird in der .Jar nicht gefunden Java Basics - Anfänger-Themen 3
J String wird in GUI falsch ausgegeben Java Basics - Anfänger-Themen 10
J JDatePicker: Datum wird nicht in Textfeld übernommen Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
J bundel - Datei wird nicht gefunden. Trotz STRG-SHIFT-J Java Basics - Anfänger-Themen 2
T PNG Datei wird nur manchmal geöffnet Java Basics - Anfänger-Themen 6
S Interpreter wird nicht gefunden Java Basics - Anfänger-Themen 1
Dann07 Sound wird nicht abgespielt Java Basics - Anfänger-Themen 25
T Dateiinhalt wird nicht in String eingelesen Java Basics - Anfänger-Themen 4
T In C:\java\bin wird kein javac angezeigt. Java Basics - Anfänger-Themen 1
T Bei mir wird keine javac angezeigt sondern nur javacpl Java Basics - Anfänger-Themen 2
U JRE_HOME Umgebungsvariable wird nicht erkannt Java Basics - Anfänger-Themen 7
B Java ist / wird kostenpflichtig. Ein paar Fragen Java Basics - Anfänger-Themen 1
H .class Datei wird nicht ausgeführt Java Basics - Anfänger-Themen 2
R Warnung, wenn eine Variable eingegeben wird Java Basics - Anfänger-Themen 6
G XML encoding wird nicht übernommen Java Basics - Anfänger-Themen 17
M ObservableList wird nicht richtig geleert Java Basics - Anfänger-Themen 0
mor16Euro Erste Schritte Wie nennt man eine While oder For schleife die nie Ausgeführt wird Java Basics - Anfänger-Themen 5
D Klassen JTextField wird nur zu 50% angezeigt. Java Basics - Anfänger-Themen 15
der_Schokomuffin Hilfe gesucht: String wird auf null gesetzt! Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Anzeige

Neue Themen


Oben