Zum Inhalt springen

MyActionListener extends Thread


Dax_ka

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...