Java timer action listener
Ihre Hilfe Hausaufgaben mit swing-Timer, action-Listener und mehrere Objekte. Ich weiß nicht, ob das posting die Frage ist hier erlaubt, aber ich habe Probleme mit der animation, hier ist was ich bisher
Erstellen Sie eine Klasse Particle, die hat zwei Felder x und y ein
Konstruktor, initialisiert diese Felder, um zufällige Werte zwischen 0
und 500, - Methoden getX und getY, die Rückgabe Ihrer Werte, und eine Methode
void move (), die zufällig addiert oder subtrahiert man zu jedem der Werte
von x und y. (Die Mengen Hinzugefügt, um x und y sind zwei separate random
zahlen.) Als Nächstes erstellen Sie eine Klasse ParticleFieldWithTimer erweitert
JPanel. Diese Klasse sollte lieber 500 * 500 Pixel groß ist. Seine
Konstruktor sollte zuerst füllen Sie ein ArrayList-Feld mit 100
Partikel-Objekte, dann starten Sie einen Swing-Timer, der die Zecken 25 mal
zweite. Bei jedem tick, die Aktion Hörer soll zuerst die Methode aufrufen
bewegen Sie für jeden Partikel, und rufen dann repaint. Die paintComponent
Methode der ParticleFieldWithTimer ziehen sollte jedes Partikel als ein 3*3
Rechteck, um seine aktuellen Koordinaten. Stellen Sie sicher, dass der Timer
stoppen, wenn der Benutzer schließt den Rahmen
Dies ist die ParticleFieldWithTimer Klasse
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class ParticleFieldWithTimer extends JPanel{
private ArrayList<Particle> particle = new ArrayList<Particle>();
Timer timer;
boolean b;
public ParticleFieldWithTimer (){
this.setPreferredSize(new Dimension(500,500));
for(int i = 0; i < 100; i++) {
particle.add(new Particle());
timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
//change polygon data
//...
Particle p = new Particle();
p.move();
repaint();
}
});
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
for (Particle p: particle) {
double temp1 = p.getX();
double temp2 = p.getX();
int tempX = (int) temp1;
int tempY = (int) temp2;
g2.fillRect(tempX, tempY, 3, 3);
}
}
public static void main(String[] args) {
final JFrame f = new JFrame("ParticleField");
final ParticleFieldWithTimer bb = new ParticleFieldWithTimer();
f.setLayout(new FlowLayout());
f.add(bb);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
try {
bb.finalize();
} catch (Throwable e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
f.dispose();
}
});
f.pack();
f.setVisible(true);
}
}
Dies ist die Partikel-Klasse
import java.util.Random;
public class Particle {
private double x , y ;
Random r = new Random();
public Particle () {
x = r.nextDouble()*500;
y = r.nextDouble()*500;
}
public Double getX() {
return x;
}
public Double getY() {
return y;
}
public void move() {
x = r.nextInt(2) - 1;
y = r.nextInt(2) - 1;
System.out.println(x + " " + y);
}
}
InformationsquelleAutor user3363135 | 2014-03-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese...
Ist der falsche Ansatz, es ist ein 100
Timer
s, die Einfluss auf die Leistung Ihres Systems.Sie sind auch die Schaffung eines neuen
Particle
jedes mal, wenn der timer-ticks, das ist nicht, was Sie wirklich wollen, zu tun, entweder, Sie wollen Einfluss auf dieParticle
s die Sie bereits erstellt haben...Erstellen Sie stattdessen Ihre Teilchen...
Dann erstellen Sie Ihre
Timer
und in ihm Durchlaufen die Partikel die Sie bereits erstellt haben...Vergessen Sie nicht, um die Stoppuhr zu starten...
Oder ändern Sie die Farbe der
Graphics
Kontext, das ist wahrscheinlich noch der hintergrund des Panels...Ich habe auch bemerkt, dass...
Nicht tun, was Sie wollen. Es wird immer Werte zwischen -1 und 1. Stattdessen werden Sie wollen, fügen Sie das Ergebnis für die x/y-Werte...
Nun, diese Art von gemacht der Werte "ziehen" über den Bildschirm in einer (meist) einheitlichen Art und Weise...
Könnten Sie versuchen, mit...
Aber das endete damit, Sie tanzen um (meistens)...
Nein, Sie wollen, Sie zu aktualisieren das gesamte Modell und dann eine einzelne
repaint
. Wäre es nicht tatsächlich eine "Menge" der Unterschied, wie dieRepaintManager
konsolidieren können wiederholte Aufruferepaint
in einer einzigen Farbe-Ereignis, aber warum das Risiko auf sich nehmen. Update das Modell in einem Schritt aktualisieren Sie die Ansicht in die nächste. DaactionPerformed
führt im Rahmen der EDT, ruftrepaint
keine Wirkung, erst NACH deractionPerformed
Methode beendet hat, sowieso (paintComponent
kann erst aufgerufen werden, wennactionPerformed
vorhanden)Danke für die Erklärung, das macht sehr viel Sinn. Aber es scheint immer noch etwas falsch mit meinem Programm in die paintcomponent ich vermute, ich sollte nicht haben eine for-Schleife, aber ich bin verwirrt, was sollte ich tun
Versuchen Sie es mit
g2.setColor(Color.RED);
bevor Sie malen alles...ich danke Ihnen so sehr für Ihre Hilfe so weit, könntest du mir auch helfen mit dem schließen der timer, wenn der Benutzer das Fenster schließt?
InformationsquelleAutor MadProgrammer