Ziehen und verschieben Sie einen Kreis in Java
Ich bin mit Swing zu erstellen, eine kleine GUI in Java. Alles, was ich bin versucht zu bekommen, es zu tun ist, nehmen Sie eine ArrayList
von Circle
s und zeichnen Sie diese. Ich habe laufen in zwei Probleme:
1) ich rufe meine draw
Methode wiederholt, bevor es zieht den Kreis. Wenn ich nur rufe meine draw
Methode einmal nichts passiert, bekomme ich eine leere Zeichnung. Wenn ich es nennen-in einer Schleife, die ausgeführt wird, für weniger als 30 Millisekunden, es zeichnet nur die erste von zwei Kreisen, die ich zeichnen will. Schließlich, wenn ich es nennen-für mehr als 30 Millisekunden zieht es die beiden Kreise, die ich versuche zu zeichnen.
und
2) Wenn ich mich bewege einen der Kreise, bekomme ich ein "flimmern" auf der Zeichnung.
Ich bin nicht allzu vertraut mit Swing-Programmierung. Ich habe gesucht mit sample-code und beobachtete ein paar videos - und was ich habe, sieht mir Recht sein. Aber ich denke, ich muss etwas Durcheinander, weil es nicht so aussieht, wie das in den videos die ich geschaut habe.
Hier ist mein GUI
Klasse:
package gui;
import draw.*;
import java.util.List;
import javax.swing.*;
public class GUI extends JFrame {
private CirclePainter drawingBoard = new CirclePainter();
public GUI()
{
setSize(500, 500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
this.add(drawingBoard);
drawingBoard.setVisible(true);
}
public void draw(List<Circle> circles)
{
drawingBoard.paintComponent(drawingBoard.getGraphics(), circles);
}
}
meine CirclePainter
Klasse
package gui;
import draw.Circle;
import javax.swing.*;
import java.awt.*;
import java.util.List;
class CirclePainter extends JPanel
{
public void paintComponent(Graphics graphics, List<Circle> circles)
{
super.paintComponent(graphics);
for(Circle circle : circles)
graphics.fillOval(circle.getX(), circle.getY(), circle.getRadius() * 2, circle.getRadius() * 2);
}
}
EDIT: redacted etwas code, da das für ein Schulprojekt. Der restliche code sollte genug sein für jemanden, der zu Besuch in der Zukunft immer noch die Frage verstehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufbauend auf dem code und die Anregungen aus Luftkissenfahrzeug Voller Aale, ein kleiner Schritt in die richtige Richtung ergriffen werden könnten, mit diesen änderungen an der GUI und CirclePainter Klassen:
Diese Weise, könnten Sie nicht behoben haben, alle grundlegenden Fragen, aber Sie bekommen Ihr Programm zu arbeiten, mit nur geringfügigen änderungen. Und Swing ist eine sehr schöne Bibliothek, die viel Spaß mehr darüber erfahren.
paintComponent(...)
direkt wie du tust.repaint()
auf eine Komponente, wenn nötig.getGraphics()
Anruf auf eine Komponente. Stattdessen zeichnen mit dem Graphics-Objekt zur Verfügung gestellt, in daspaintComponent
Methode.while (true)
Schleifen in einer Swing-GUI, wie Sie Risiken binden das Swing-Ereignis-Threads und einfrieren des GUI. Verwenden Sie einen Swing-Timer für einfache Animationen.contains(Point p)
Methode, die Ihnen helfen, festzustellen, ob ein Maus-Klick landet im inneren des Kreises.g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
wo g2 ist dein Graphics2D Objekt.RenderingHints.VALUE_ANTIALIAS_ON);
paintComponent
Methode ist nicht wahr paintComponent überschreiben und somit nicht korrekt arbeitet. Es sollte einprotected
Methode, nichtpublic
es sollte einen parameter, eineGraphics
Objekt, und nKlicken einen zweiten parameter, und Sie sollten die@Override
Anmerkung oben.Zum Beispiel, bitte haben Sie einen Blick auf diese Antwort von mir zu einem ähnlichen problem.
Ein Beispiel für eine paintComponent-Methode, dass die Zentren der Kreise an, die _x-und _y-und nutzt die rendering hints: