Würde gerne eine kleine Animation machen. Habe dazu 10 labels, in die ich im Abstand von 500ms was reinschreibe, lösche und in das nächste was reinschreibe…
Meine erste Idee wäre so gewesen:
label01.setText("X");
try{
Thread.sleep(500);
}catch(Exception e){}
}
label01.setText("");
label02.setText("X");
try{
Thread.sleep(500);
}catch(Exception e){}
}
//usw. bis halt zum label10
Ok, ich denke das dürfte funktionieren, nur finde ich das ziemlich viel Schreibarbeit und die Klasse wird vollgestopft! Das müßte man doch auch irgendwie sauber in einer Schleife verpacken können???
naja das einfachste denke ich wäre nen Array/Vector wo du die Sachen reinpackst und dann einfach drüber läufst, das kann man natürlich noch viel weiter treiben aber das wäre so meine erste einfache Idee
Der Code dürfte etwa so aussehen (das try catch kannst du dir selbst denken:p )
for( int i = 0; i < array.length; i++ ){
if( i > 0 )
array[i-1].setText( "" );
array**.setText( "x" );
Thread.sleep( 500 );
}```
P.S. Da Swing nicht threadsicher ist, wäre es besser, den Aufruf von "setText" in den EventDispatcherThread (EDT) zu verlegen:
```for( int i = ... ){
final JLabel current = array**;
EventQueue.invokeLater( new Runnable(){
public void run(){
current.setText( "x" );
}
});```
Eine andere Idee, die noch einfacher als der Thread ist: benutz einen javax.swing.Timer :) Da hängst du einen ActionListener an, und der bekommt alle paar Millisekunden eine Nachricht. Über Thread-synchronisation musst du dir dann keine Sorgen mehr machen.
[Edit: Bitte Eagle, komm mal in diesem Jahrtausend an ... und verwende Generics :-P ]
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
}
};
new Timer(delay, taskPerformer).start();```
Du kannst da jede beliebige Klasse als ActionListener nehmen. Ich würde intern ein Zähler machen, der sagt, welches Label gerade das "x" hat. Das dürfte dann etwa so aussehen:
```public class Animation implements ActionListener{
private JLabel[] labels;
private int current = -1;
public Animation( JLabel[] labels ){
this.labels = labels;
}
public void actionPerformed( ActionEvent e ){
if( current >= 0 )
labels[ current ].setText( "" );
current++;
labels[current].setText( "x" );
}
}```
Die Labels werden über den Konstruktor gegeben, zusammengebaut werden sie irgendwo in deiner GUI.
Mein Code kümmert sich jetzt nicht um das Ende der Animation, aber ein zusätzliches "if" dürfte ja nicht so schwer sein ;-)
Allenfalls kann diese Klasse auch gleich von "Timer" erben, dann hast du eine "start" und "stop" Methode der Animation.
Ich bin echt zu blöd… ich bekomme das Beispiel von Beni nicht hin und jetzt habe ich eigentlich noch ein einfach anmutendes Beispiel gefunden, doch auch hier verzweifle ich:
import java.util.*;
import java.awt.event.*;
class Animation implements ActionListener{
int delay = 1000;
Timer t = new Timer(delay, new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Neues Bild zeichnen
}
});
t.start();
}
Was könnte hier alles falsch sein? Der Compiler meint bei t.start(); expected
import java.util.*;
import java.awt.event.*;
class Warten2 implements ActionListener{
public void machWas(){
int delay = 1000;
Timer t = new Timer(delay, new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Neues Bild zeichnen
}
});
t.start();
}
}
Jetzt gibts folgende Fehlermeldungen:
4: Warten2 is not abstract and does not override abstract method actionPerformed(java.awt.event.ActionEvent) in java.awt.event.ActionListener
class Warten2 implements ActionListener{
9: cannot resolve symbol
symbol : constructor Timer (int,)
location: class java.util.Timer
Timer t = new Timer(delay, new ActionListener() {
14: cannot resolve symbol
symbol : method start ()
location: class java.util.Timer
t.start();
Ok, schon mal danke, jetzt wird sauber compilet. Aber ich bin wohl echt zu blöd, hab das jetzt so gemacht und ausgeführt, es wird aber nichts ausgegeben:
import java.util.*;
import java.awt.event.*;
import javax.swing.Timer;
public class Warten2 {
public Warten2(){
machWas();
}
public void machWas(){
int delay = 1000;
Timer t = new Timer(delay, new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Hallo");
}
});
t.start();
}
public static void main(String[] args){
new Warten2();
}
}
Ok, das Problem hab ich gelöst, soll ja auf einem JFrame was passieren. Jetzt bin ich etwas weiter und hänge am nächsten Problem, der Text der JLabels wird nicht neu geschrieben:
import java.util.*;
import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.*;
import java.awt.*;
public class Warten2 extends JFrame{
public JLabel Hallo01, Hallo02;
public JLabel[] array= {Hallo01, Hallo02};
private int current = -1;
public Warten2(){
setSize(200,200);
getContentPane().setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
Hallo01 = new JLabel("Da ");
getContentPane().add(Hallo01);
Hallo02 = new JLabel("Schau ");
getContentPane().add(Hallo02);
setVisible(true);
machWas();
}
public void machWas(){
int delay = 1000;
// for( int i = 0; i < array.length; i++ ){
if( current >= 0 ) {
Timer t = new Timer(delay, new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Hallo");
array[ current ].setText( "" );
current++;
array[current].setText( "x" );
}
});
t.start();
}
}
public static void main(String[] args){
new Warten2();
}
}
ändere das mal weil ich nicht genau weiß wie sich das mit dem Array ist
import java.util.*;
import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.*;
import java.awt.*;
public class Warten2 extends JFrame{
public JLabel[] array= new JLabel[2]
private int current = -1;
public Warten2(){
setSize(200,200);
getContentPane().setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
array[0] = new JLabel("Da ");
getContentPane().add(array[0]);
array[1] = new JLabel("Schau ");
getContentPane().add(array[1]);
setVisible(true);
machWas();
}
public void machWas(){
int delay = 1000;
// for( int i = 0; i < array.length; i++ ){
if( current >= 0 ) {
Timer t = new Timer(delay, new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Hallo");
array[ current ].setText( "" );
current++;
array[current].setText( "x" );
}
});
t.start();
}
}
public static void main(String[] args){
new Warten2();
}
}