hyperion Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 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 } Zitieren
speedi Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 (bearbeitet) 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 3. Dezember 2008 von speedi Zitieren
hyperion Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 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 Zitieren
speedi Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 (bearbeitet) 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 3. Dezember 2008 von speedi Zitieren
hyperion Geschrieben 4. Dezember 2008 Autor Geschrieben 4. Dezember 2008 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 Zitieren
perdian Geschrieben 4. Dezember 2008 Geschrieben 4. Dezember 2008 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. Zitieren
speedi Geschrieben 4. Dezember 2008 Geschrieben 4. Dezember 2008 (bearbeitet) 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 4. Dezember 2008 von speedi Zitieren
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.