Timer w Java

0

Witam wszystkich.
Temat pare raze sie przeciagnal, ale nie udalo mi sie z tego cos wykombinowac zeby dzialalo tak jak chce.
Probuje zrobic licznik sekundowy ktory bedzie sie zmiejszal od 5 sekund do zera tak jak w grach gdzie czas jest ograniczony.

W zasadzie skopiowalem to z tego forum i dziala wysmienicie:

Timer timer1 = new Timer();
MyTimerTask czas = new MyTimerTask();
timer1.schedule (czas, 0, 1000);

I klasa:

class MyTimerTask extends TimerTask
{
	int i = 0;
	
	  public void run()
	  {
	    System.out.println(i++);
	  }
	 }

Chcialbym stworzyc applet ktory na poczatku ma menu, po wybraniu pierwszej opcji, czas powinien sie zmiejszac i jak dojdzie do zera powinien sie anulowac czyli timer1.canel();

Jak moge zrobic zeby ten TimerSchedule uruchamial sie pare razy?

Kompilator wyrzuca mi blad jak probuje jeszcze raz uzyc tej instrukcji

timer1.schedule (czas, 0, 1000);
0

Przed wywołaniem

timer1.schedule (czas, 0, 1000);

twórz nowy Timer.

0

Dzieki za odpowiedz.

Z pomoca internetu mam taki kod:

package testtimera2;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;

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


public class main extends JFrame implements ActionListener{
	private JButton btnStart, btnExit;
	private JLabel lblStart;
	private JPanel panel;
	Timer timer1 = new Timer();
	
	public main(){
		super("Gra");
		setSize(800,600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//buttons
		btnStart = new JButton("Start");
		btnExit = new JButton("Exit");
		
		//labels
		lblStart = new JLabel("0");
			
		//panel as a board
		panel = new JPanel();
		panel.setLayout(new FlowLayout(0,30,30));		
		
		panel.add(btnStart);
		panel.add(btnExit);
		panel.add(lblStart);
		getContentPane().add(panel);
		
		btnStart.addActionListener(this);
		btnExit.addActionListener(this);
		
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		switch(e.getActionCommand()){
		case "Start":
			lblStart.setText(e.getActionCommand());
			lblStart.setForeground(Color.BLACK);
			timer1.schedule(new MyTask(),5000);
			break;
		case "Exit":
			lblStart.setText(e.getActionCommand());
			lblStart.setForeground(Color.BLUE);
			break;
		}
	}

	class MyTask extends TimerTask {
	    public void run() {
	      lblStart.setText("Time's up");
	      timer1.cancel();
	    }
	  }
	
	public static final void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new main().setVisible(true);
            }
        });
    }
}

Klikajac na button Start dziala za piewrszym razem i tylko wtedy, z nastepnym kliknieciem kompilator wyrzuca bledy, chodzi pewnie o to ze timer zostal cancelowany.
Czy piszac zebym tworzyl nowy timer za kazdym razem, masz na mysli cos takiego :

@Override
	public void actionPerformed(ActionEvent e) {
		switch(e.getActionCommand()){
		case "Start":
			lblStart.setText(e.getActionCommand());
			lblStart.setForeground(Color.BLACK);
                    **Timer timer1 = new Timer();**
			timer1.schedule(new MyTask(),5000);
			break;
		case "Exit":
			lblStart.setText(e.getActionCommand());
			lblStart.setForeground(Color.BLUE);
			break;
		}
0

Nie, mam na myśli takie coś

        case "Start":
            lblStart.setText(e.getActionCommand());
            lblStart.setForeground(Color.BLACK);
            timer1 = new Timer();
            timer1.schedule(new MyTask(),5000);
            break;

Wstawiaj kod w znaczniki <code class="java"></code>

0

Jeszcze raz dzieki.
Wydaje mi sie ze chyba juz nie potrzebuje cancelowac timera1 bo za kazdym razem jest on automatycznie tworzony na nowo, tak?

class MyTask extends TimerTask {
	    public void run() {
	      lblStart.setText("Time's up");
	      **timer1.cancel();**
	    }
	  }

Kolejne moje pytanie to, czy teraz aby zrobic efekt zmiejszajacego sie czasu na elemencie label musze stworzyc nowa class np MyTaskSekundy extends TimerTask i stworzyc nowy timer2?
Czyli cos takiego:

int sekundy = 5;
...
class MyTaskSekundy extends TimerTask {
	    public void run() {
	      lblStart.setText(sekundy);
              sekundy=sekundy-1;
	      **timer2.cancel();**
	    }
	  }
0

Przy tym sposobie musiałbyś mieć 5 timerów, każdy byłby odpowiedzialny za inny napis. Użyj innej metody

timer1.schedule(new MyTask(),1000,1000);

https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html#schedule-java.util.TimerTask-long-long-

0

Wielkie dzieki, juz zalapalem. A w klasie MyTask warunek If (sekundy <1) then "time's up".

0

Tak. Taki "niejednorazowy" timer musisz kończyć poleceniem cancel().

1 użytkowników online, w tym zalogowanych: 0, gości: 1