MyActionListener extends Thread

Dax_ka

Mitglied
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

Java:
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

Java:
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

Java:
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()" ); 
	      } 
	    } 
	 } 
 }

Java:
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
 
Zuletzt bearbeitet:
Ich habe folgende Veränderungen vor genommen:

Java:
public class test extends MyActionListener implements ActionListener{

	String ausg;
	
	test(Window f,String ausg) {
		super(f);
		this.ausg=ausg;
	}
	
	public void actionPerformed(ActionEvent e){
		f.txtAusg.setText(""+ausg);
	}
	
	int i=0;
	
	public void run(){  
	    while ( ! isInterrupted() ) 
	    { 
	      System.out.println("ich werd verrückt "+i);
	      i++;
	      //Problem 
	      ausg=""+i;

und

Java:
public class MyActionListener extends Thread implements ActionListener{
	
	public Window f;
	MyActionListener(Window f) {
		this.f = f;
	}// MyActionListener(Window f)
	
	
	Thread a = new test(f, null);
	int firsttime=0;

Ich hatte gehofft über vererbung die actionPerformed auch in meiner klasse test mit dem thread nutzen zu können.
Eclipse unterstreicht nix aber beim compilieren erhalte ich folgende Fehlermeldung:

Exception in thread "main" java.lang.StackOverflowError
at java.security.AccessControlContext.optimize(Unknown Source)
at java.security.AccessController.getContext(Unknown Source)
at java.lang.Thread.init(Unknown Source)
at java.lang.Thread.<init>(Unknown Source)
at Hans_Peter.MyActionListener.<init>(MyActionListener.java:8)
at Hans_Peter.test.<init>(test.java:11)

..und diese meldung einige male
at Hans_Peter.MyActionListener.<init>(MyActionListener.java:13)
at Hans_Peter.test.<init>(test.java:11)


Wenn irgendwer auch nur ne Idee hat. Immer raus damit. Ich steh mit diesem Projekt mittlerweile ein bisschen unter zeitdruck, da ich das hier beschriebene Problem nur aus dem eigentlich programm isoliert habe.
Falls jemand der meinung ist meine ganze herangehensweise und umsetzung an das was ich da machen will ist mist. Dann sagt mir das, damit ich es neu machen kann. Und wenn ihr meine goss- und kleinschreibung doof findet dann sagt es mir auch.
 
Lass die Threads in den ActionListener weg und greife aus denen mit geeigneten Mitteln/Methoden auf den "Stoppuhr"-Thread zu.
 
So gehts jetz. Weiss jetz nich ob fastjack das meinte, aber durch das googlen von java thread stoppuhr, hab ich nen anderes programm gefunden, dass ich meinem anpassen konnte. Danke

Java:
package Hans_Peter;

import java.awt.event.*;
import javax.swing.*;
public class MyActionListener extends Thread implements ActionListener, Runnable{
	
	public Window f;
	int i=0;
	private Thread a = new Thread(this);
	boolean firsttime=true;
	
	MyActionListener(Window f) {
		this.f = f;
	}// MyActionListener(Window f)
	
	
	
	public void run(){  
        while ( ! isInterrupted() ) 
        { 
          i++;
          f.txtAusg.setText(""+i);
          
          try 
          { 
           Thread.sleep( 1000 ); 
          } 
          catch ( InterruptedException e ) 
          { 
           interrupt(); 
           System.out.println( "a sleep()" ); 
          } 
        } 
     } 
	
public void actionPerformed(ActionEvent e){
        
        if (e.getSource () == f.btnStart) {
            if(firsttime){
                a.start();
                firsttime=false;
                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
 

Zurück
Oben