Dax_ka Geschrieben 9. Januar 2011 Teilen Geschrieben 9. Januar 2011 Hallo, Habe ein paar Probleme mit dem Arbeiten mit Treads und dem ActionListener. Das Programm soll wie eine Stopuhr einfach jede Sekunde hochzählen und sich dabei per Buttuns Starten und Stopen lassen. Das funktioniert auch. Allerdings ebennur in der Console. Und ich will die Ausgabe des Zählers aber in dem textfield txtAusg haben. Hab schon ne ganze weile rum probiert, aber ohne nennenswerte Erfolge.:rtfm: ???:L package Hans_Peter; import Hans_Peter.Window; import java.util.*; public class Timer{ public static void main(String[] args){ Window w = new Window(); }//public static void main(String[] args) }//public class Timer package Hans_Peter; import java.awt.*; import javax.swing.*; import Hans_Peter.MyActionListener; public class Window extends Frame{ private static final long serialVersionUID = 1L; public MyActionListener actionListener = new MyActionListener(this); public MyWindowListener myWindowListener = new MyWindowListener(); //Bereich A public TextArea txtAusg = new TextArea(); public Button btnStart = new Button("Start"); public Button btnPause = new Button("Pause"); public Button btnSchliessen = new Button("Schliessen"); public Window(){ super("Timer"); this.setSize(360,250); this.setLayout(null); this.addWindowListener(myWindowListener); this.setBackground(Color.lightGray); this.setVisible(true); //Ausgabe Fenster Font font = new Font("SansSerif",Font.PLAIN,20); txtAusg.setFont(font.deriveFont(Font.PLAIN,40)); txtAusg.setBounds(50,50,260,100); this.add(txtAusg); //Button Start btnStart.setBounds(50,170,80,25); this.add(btnStart); btnStart.addActionListener(actionListener); //Button Pause btnPause.setBounds(140,170,80,25); this.add(btnPause); btnPause.addActionListener(actionListener); //Button Schliessen btnSchliessen.setBounds(230,170,80,25); this.add(btnSchliessen); btnSchliessen.addActionListener(actionListener); }//public Window() }//public class Window Hier will ich den zählerstand ausgeben package Hans_Peter; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class test extends Thread{ public Window f; test(Window f) { this.f = f; } int i=0; public void run(){ while ( ! isInterrupted() ) { System.out.println("ich werd verrückt "+i); i++; //Problem //Ausgabe in txtAusg von i try { Thread.sleep( 1000 ); } catch ( InterruptedException e ) { interrupt(); System.out.println( "a sleep()" ); } } } } oder den zählerstand irgendwie in die methode actionPerformed() schieben. package Hans_Peter; import java.awt.event.*; import javax.swing.*; public class MyActionListener extends Thread implements ActionListener{ public Window f; MyActionListener(Window f) { this.f = f; }// MyActionListener(Window f) Thread a = new test(f); int firsttime=0; public void actionPerformed(ActionEvent e){ if (e.getSource () == f.btnStart) { if(firsttime==0){ a.start(); firsttime=1; f.txtAusg.setText("bla"); } a.resume(); } if (e.getSource() == f.btnPause) { a.suspend(); } if (e.getSource() == f.btnSchliessen) { a.stop(); System.exit(0); } }//public void actionPerformed(ActionEvent e) }// public class MyActionListener implements ActionListener Hoffe ihr könnt mir helfen. Dax Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 10. Januar 2011 Teilen Geschrieben 10. Januar 2011 Und wodrin besteht jetzt genau dein Problem? Dort wo du ansonsten deinen Zähler in der Konsole ausgibst, müsstest du nun den Text in das Textfeld schreiben. Wenn du das direkt an der selben Stelle tun willst, müsstest du in dem Thread eine Referenz auf das Textfeld halten damit du in dieses auch schreiben kannst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wurmi Geschrieben 10. Januar 2011 Teilen Geschrieben 10. Januar 2011 Hi, ich kann nur ganz kurz was sagen, frickle an etwas ganz Anderem und habe nur kurz Pause. Das Zeichnen von Bildschirmelementen passiert in einem eigenen Bildschirm-Thread ("EventQueue"), der nichts mit Deinem Testhread zu tun hat. Ich wurde einmal folgendes probieren: Eine eigene Klasse, die das Zeichnen vom Textfeld macht. class Zeichne_txtAusg extends Thread { String text; TextArea txtAusg; public Zeichne_txtAusg( TextArea txtAusg, String text ) { this.text = text; this.txtAusg = txtAusg; } public void run() { txtAusg.setText( text ); } } In deinem Thread, wo Problem steht, würde ich den Aufruf des Zeichenthreads machen; EventQueue.invokeLater( new Zeichne_txtAusg( txtAusg, "Wert"+i) ); Dazu muß die Klasse Test (Klassen immer mit Großbuchstaben anfangen!)natürlich die textArea kennen (im Konstruktor übergeben). Ich bin jetzt nicht sicher, ob das in AWT genauso wie in Swing geht, konnte es nicht ausprobieren, aber vielleicht hilft es Dir weiter. Zuhause habe ich das Buch von Oechsle "Parallele und verteilte Anwendungen in Java", da steht ein ganz ausführliches Beispiel, wie das Design für eine solche Uhr mit Threads zu machen ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.