Zum Inhalt springen

Objekt an TimerTask


hyperion

Empfohlene Beiträge

Hallo,

in meiner Anwendung soll der Text eines JLabels ständig verändert werden. Mein Problem ist, dass es aber keinen entsprechenden Konstruktor gibt, also habe ich mir eine Klass erstellt und diese von TimerTask abgeleitet. Ich habe auch einen Konstruktor erzeugt, mit welchem ich ein JLabel übergeben kann.

class abc extends TimerTask

{

abc(JLabel ausgabeLabel)

{

this.ausgabeLabel = ausgabeLabel;

//run();

}

public void run()

{

ausgabeLabel.setText("fasdf");

}

Ich habe es mit und ohne run() aufruf im Konstruktor probiert, beides hat nicht funktioniert.

Hat jemand eine Idee wie ich das JLabel in der TimerTask verändern kann?

mfg hyperion

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du einfach nur die run() von irgendwo rufst ist das ne ganz normale Methode die dein Programm abarbeitet. Du musst es von einem Thread aufrufen lassen. Timer stellt dir die dazu nötige Komfortmethode zur verfügung.

import java.util.Timer;

import java.util.TimerTask;



public class Bla {

	public Bla() {

		TimerTask t = new MyTimer();

		Timer timer = new Timer();

		timer.schedule(t, 1000, 1000); //timertask, start nach 1000 ms, aufruf alle 1000 ms

	}


	public class MyTimer extends TimerTask{

		int counter = 0;


		public void run() {

			counter++;


			System.out.println("Blubb "+counter);

		}

	}


	public static void main(String[] args) {

		new Bla();

	}

}
Eine weitere Variante wäre ein normaler Thread:

public class Bla {

	public Bla() {

		MyThread t = new MyThread();

		t.start();

	}


	public class MyThread extends Thread{

		int counter = 0;

		int delay;


		public MyThread() {

			this(1000);

		}


		public MyThread(int delay) {

			this.delay = delay;

		}


		public void run() {

			while(!isInterrupted()){

				try{

					Thread.sleep(delay);

				}catch(InterruptedException e){}


				counter++;


				System.out.println("Blubb "+counter);

			}

		}

	}


	public static void main(String[] args) {

		new Bla();

	}

}

Und die dritte geläufige Methode: Der Timer von javax.swing

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


import javax.swing.Timer;


public class Bla {

	public Bla() {

		ActionListener listener = new ActionListener(){

			int counter = 0;


			public void actionPerformed(ActionEvent e) {

				counter++;

				System.out.println("Blubb "+counter);

			}

		};


		Timer t = new Timer(1000, listener);

		t.start();

	}




	public static void main(String[] args) {

		new Bla();

	}

}

Bearbeitet von speedi
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

danke für deinen Post aber soweit war ich eigentlich schon.

Einen einfachen Zähler habe ich auch schon realisiert. Das Problem ist, dass ich eine Klasse habe welche mir eine GUI erzeugt und in dieser GUI steckt ein JLabel "a".

Nun will ich, dass das JLabel a ständig aktuallisiert wird, aber ich kann von meiner TimerTask Klasse ja nicht auf Elemente einer anderen Klasse zugreifen und ich kann auch kein JLabel an meine abgeleitete Klasse übergeben, da das aus irgendeinem Grund nicht funktioniert. ( Ich vemrute da der Konstruktor von TimerTask protected ist).

Sorry wen die Erklärung etwas verwirrend ist.

mfg hyperion

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja und? Die Lösungen sind eigentlich ausreichen die icch dir geschrieben habe, aber dann eben doch nochmal ausführlicher:

import javax.swing.JFrame;

import javax.swing.JLabel;



public class Test extends Thread{

	private JLabel label;

	private int zeit = 0;

	private int delay = 1000;


	public Test(JLabel label) {

		this.label = label;

	}


	public void run() {

		while(!isInterrupted()){

			try{

				Thread.sleep(delay);

			}catch(InterruptedException e){}

			zeit++;


			label.setText(""+zeit);

		}

	}



	public static void main(String[] args) {

		JFrame frame = new JFrame();

		frame.setBounds(0,0,100,100);


		JLabel zeit = new JLabel();

		frame.add(zeit);

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		frame.setVisible(true);


		Thread t = new Test(zeit);

		t.start();

	}

}

und mit TimerTask gehts auch wunderbar:

import java.util.Timer;

import java.util.TimerTask;


import javax.swing.JFrame;

import javax.swing.JLabel;


public class Test extends TimerTask{

	private int zeit = 0;

	private JLabel label;


	public Test(JLabel label) {

		this.label = label;

	}


	public void run() {

		zeit++;

		label.setText(""+zeit);

	}


	public static void main(String[] args) {

		JFrame frame = new JFrame();

		frame.setBounds(0,0,100,100);


		JLabel zeit = new JLabel();

		frame.add(zeit);

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		frame.setVisible(true);


		Timer timer = new Timer();

		timer.schedule(new Test(zeit), 1000, 1000);

	}

}

Ich kenne deine Software-Architektur nicht, aber wie du das Label in den TimerTask, Thread oder ActionListener bekommst sollte normal nicht all zu schwer sein. Wenn du z.B. sicher sein kannst, dass zur Laufzeit des Programms das Label nicht mehr als einmal vorhanden ist könntest du es in eine statische variable speichern und von überall abrufen: DeineGUI.getLabelInstance();

Bearbeitet von speedi
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ok vielleicht stehe ich auf dem Schlauch aber ich verstehe nicht wie mir dein Post weiterhelfen soll. In meinem Fall erbt meine Klasse ja schon von Applet und da in Java keine Mehrfachvererbung unterstütz wird stehe ich vor einer Wand. Also hier ist mein Programm:



import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import java.applet.*;

import java.util.Timer;


public class Gehaltsrechner extends Applet implements ActionListener

{

	JPanel hauptPanel;	


		JPanel panelStundenLohn;

			JLabel lblStundenLohn;

			JTextField eingabeStundenLohn;


		JPanel panelStartZeit;

			JLabel lblStartZeit;

			JTextField eingabeStartZeit;

			JButton rechneVerdienst;


		JPanel panelVerdienst;

			JLabel lblVerdienst;

			JLabel ausgabeVerdienst;


	public void init()

	{

		setBackground(Color.BLUE);


		hauptPanel = new JPanel();

		hauptPanel.setLayout(new GridLayout(3, 1));

		hauptPanel.setBackground(Color.WHITE);		

		hauptPanel.setPreferredSize(new Dimension(300,300));

		add(hauptPanel);


		panelStundenLohn = new JPanel();

		panelStundenLohn.setBackground(Color.BLACK);

		hauptPanel.add(panelStundenLohn);


			lblStundenLohn = new JLabel("Stundenlohn:");

			panelStundenLohn.add(lblStundenLohn);


			eingabeStundenLohn = new JTextField(5);

			panelStundenLohn.add(eingabeStundenLohn);


		panelStartZeit = new JPanel();

		panelStartZeit.setBackground(Color.RED);

		hauptPanel.add(panelStartZeit);


			lblStartZeit = new JLabel("Arbeitsbeginn:");

			panelStartZeit.add(lblStartZeit);


			eingabeStartZeit = new JTextField("06:23");

			panelStartZeit.add(eingabeStartZeit);


			rechneVerdienst = new JButton("Berechnen");

			panelStartZeit.add(rechneVerdienst);


		panelVerdienst = new JPanel();

		panelVerdienst.setBackground(Color.YELLOW);

		hauptPanel.add(panelVerdienst);


			lblVerdienst = new JLabel("Heutiger Verdienst:");

			panelVerdienst.add(lblVerdienst);


			ausgabeVerdienst = new JLabel();

			panelVerdienst.add (ausgabeVerdienst);		

	}



	public void actionPerformed(ActionEvent aEvent)

	{

		Timer timer = new Timer();

		timer.schedule(new TimerTaskClass(ausgabeVerdienst), 0, 500);

	}


}


class TimerTaskClass extends TimerTask

{

	JLabel ausgabeVerdienst;

	int n;


	TimerTaskClass(JLabel ausgabeVerdienst)

	{

		this.ausgabeVerdienst = ausgabeVerdienst;

		run();

	}


	public void run()

	{

	    n = n + 1;

		ausgabeVerdienst.setText(String.valueOf(n));

	}

}

Ich denke man kann erkennnen wie ich versuche das JLabel zu übergeben.

mfg hyperion

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun will ich, dass das JLabel a ständig aktuallisiert wird, aber ich kann von meiner TimerTask Klasse ja nicht auf Elemente einer anderen Klasse zugreifen und ich kann auch kein JLabel an meine abgeleitete Klasse übergeben, da das aus irgendeinem Grund nicht funktioniert.
Ich denke du solltest erstmal drei Schritte zurück gehen und nochmal bei den Java Grundlagen anfangen. So wie ich es sehe fehlen dir grundlegende Kenntnisse über Dinge wie Komposition und Assoziation - und ohne das wirst du immer wieder vor die Wand laufen.

Bevor du also das erste Obergeschoss baust solltest du zunächst sicherstellen, dass das Fundament dein Haus auch trägt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mal abgesehen davon, dass dein Quellcode wohl einer der unerotischsten ist die ich je gesehen haben (wieso machst du ein Applet direkt zu einem ActionListener? Und TimerTaskClass ist kein aussagekräftiger Name für eine Ableitung von TimerTask).

Hier ein nochmals ein kleines Beispiel:

import javax.swing.*;

import java.awt.*;

import java.util.*;

import java.applet.*;

import java.util.Timer;


public class Gehaltsrechner extends Applet{

	JPanel hauptPanel;


	JPanel panelStundenLohn;

	JLabel lblStundenLohn;

	JTextField eingabeStundenLohn;


	JPanel panelStartZeit;

	JLabel lblStartZeit;

	JTextField eingabeStartZeit;

	JButton rechneVerdienst;


	JPanel panelVerdienst;

	JLabel lblVerdienst;

	JLabel ausgabeVerdienst;


	public void init() {

		setBackground(Color.BLUE);


		hauptPanel = new JPanel();

		hauptPanel.setLayout(new GridLayout(3, 1));

		hauptPanel.setBackground(Color.WHITE);

		setSize(500, 120);

		add(hauptPanel);


		panelStundenLohn = new JPanel();

		panelStundenLohn.setBackground(Color.BLACK);

		hauptPanel.add(panelStundenLohn);


		lblStundenLohn = new JLabel("Stundenlohn:");

		lblStundenLohn.setForeground(Color.WHITE);

		panelStundenLohn.add(lblStundenLohn);


		eingabeStundenLohn = new JTextField(5);

		panelStundenLohn.add(eingabeStundenLohn);


		panelStartZeit = new JPanel();

		panelStartZeit.setBackground(Color.RED);

		hauptPanel.add(panelStartZeit);


		lblStartZeit = new JLabel("Arbeitsbeginn:");

		panelStartZeit.add(lblStartZeit);


		eingabeStartZeit = new JTextField("06:23");

		panelStartZeit.add(eingabeStartZeit);


		rechneVerdienst = new JButton("Berechnen");

		panelStartZeit.add(rechneVerdienst);


		panelVerdienst = new JPanel();

		panelVerdienst.setBackground(Color.YELLOW);

		hauptPanel.add(panelVerdienst);


		lblVerdienst = new JLabel("Heutiger Verdienst:");

		panelVerdienst.add(lblVerdienst);


		ausgabeVerdienst = new JLabel();

		ausgabeVerdienst.setPreferredSize(new Dimension(100,20));

		panelVerdienst.add(ausgabeVerdienst);


		Timer timer = new Timer();

		timer.schedule(new TimerTaskClass(ausgabeVerdienst), 5000,1000);

	}


	class TimerTaskClass extends TimerTask {

		JLabel ausgabeVerdienst;

		int n;

		String [] ausgabe = new String []{"Ich","kann","dir","nur","den","Weg","zeigen",",","gehen","musst","du","ihn","jedoch","selbst","!"};


		TimerTaskClass(JLabel ausgabeVerdienst) {

			this.ausgabeVerdienst = ausgabeVerdienst;

			run();

		}


		public void run() {

			if(n >= ausgabe.length){

				n = 0;

			}

			ausgabeVerdienst.setText(ausgabe[n]);

			n = n + 1;

		}

	}

}

Ich weiß nicht was ich noch machen soll. Ich habe dir jetzt genug Beispiele geliefert. Wenn du die Grundlagen von Java annähernd beherrschst und dich ein wenig anstrengst ist das eigentlich keine große Sache.

Man kann erkennen wie du das Label übergibst. Aber wo startest du den TimerTask? Bzw. der ActionListener von deinem Timer wird !nirgends! verwendet.

Wenn du eine Klasse in einer Klasse hast, kann diese übrigens auf alle Klassenvariablen der Klasse in der sie steckt zugreifen. Also brauchst du dein Label eigentlich nichtmal übergeben.

Im übrigen: wo ist bei deiner Rechnung die gesetzliche Mittagspause und die 15-Minuten-Pause für Mitarbeiter unter 18? Ich glaub ich geh gleich mal zum Chef und sag dass ich die Pausen auch als Arbeitszeit angerechnet haben will. Die Zeit gehört ja schließlich eher zum Arbeitstag als zur Freizeit.

Bearbeitet von speedi
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...