Anwendung (Label soll dauernt den text ändern)

mrno

Erfahrenes Mitglied
Hi,
ich habe ein großes problem. Ich will ein programm schreiben mit einer counter funktion.
Code für den Counter sieht so aus.
public void count()
{
while (zeit>0) {
zeit--;
label1.setText("" + zeit);
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
}
}
}

Mein problem ist solange der counter läuft reagiert das programm nicht mehr. Gibt es eine möglichkeit, das ich auch wären der counter läuft andere funktionen des programmes nuten kann. oder den counter per klick auf einem button stoppen kann?
 
Original geschrieben von mrno
Hi,
ich habe ein großes problem. Ich will ein programm schreiben mit einer counter funktion.
Code für den Counter sieht so aus.
public void count()
{
while (zeit>0) {
zeit--;
label1.setText("" + zeit);
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
}
}
}

Mein problem ist solange der counter läuft reagiert das programm nicht mehr. Gibt es eine möglichkeit, das ich auch wären der counter läuft andere funktionen des programmes nuten kann. oder den counter per klick auf einem button stoppen kann?

Das geht wohl am besten in einem Thread. Z.B. so:
Code:
MyThread myThread = new MyThread();
myThread.start();

class MyThread extends Thread
{
  public void start()
  {
   while (zeit>0)
   {
    zeit--;
    label1.setText("" + zeit);
    try
    {
      Thread.sleep(1000);
    }
    catch (InterruptedException e)
    {
    }
  }
 }
}

Ich hoffe ich habe nichts vergessen...
 
So hatte ich es bis jetzt auch. Mein problem ist jetzt nur solange das Thread läuft reagiert der rest vom Programm nicht mehr. Ich will aber das man andere sachen nebenher machen kann.
 
Hallo!

Was verwendest du denn für deine GUI? (AWT, SWT, Swing)?
In den meisten GUI System dürfen Veränderungen am UI nur durch den UI bzw. EventDispatch Therad durchgeführt werden.

Beispiel1

Code:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

/*
 * Created on 15.08.2004
 */

/**
 * @author Administrator
 * http://www.tutorials.de
 */
public class Ticker extends JFrame {

	private final JLabel label;
	private Timer timer;

	public Ticker() {
		super("Ticker");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		timer = new Timer(100, new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				label.setText("" + System.currentTimeMillis());
			}
		});

		label = new JLabel("" + System.currentTimeMillis());
		getContentPane().add(label, BorderLayout.CENTER);

		timer.start();
		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new Ticker();
	}
}

Beispiel2:

Code:
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

/*
 * Created on 15.08.2004
 */

/**
 * @author Administrator
 * http://www.tutorials.de
 */
public class Ticker extends JFrame {

	private final JLabel label;
	private Runnable runnable;
	private Thread refresherThread = new Thread() {
		{
			setPriority(Thread.MIN_PRIORITY);
		}
		public void run() {
			try {
				while (true) {
					SwingUtilities.invokeLater(runnable);
					sleep(100);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	};

	public Ticker() {
		super("Ticker");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		runnable = new Runnable() {
			public void run() {
				label.setText("" + System.currentTimeMillis());
			}
		};
		label = new JLabel("" + System.currentTimeMillis());
		getContentPane().add(label, BorderLayout.CENTER);

		refresherThread.start();

		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new Ticker();
	}
}

Gruß Tom
 
Zurück