czas naciśnięcia przycisku - Java

0

Witam serdecznie,

chciałam uprzejmie się dopytać jak pobrać czas naciskania na określony przycisk z klawiatury . W gdy wybrany jest prawidłowy przycisk, zostaje pobrany czas, oraz zostaje rysowany obiekt. Po wyjściu z pętli pobieram, również czas zakończenia trzymania przycisku. Oczywiście odejmuje końcowy czas od początkowego, ale zwraca mi zawsze 0 lub 1 . Domyślam się czemu 0 lub 1 , pobiera tylko jedna sekundę i zaczyna od początku liczyć.
Chciałam uprzejmie zapytać się, gdzie wstawić pobranie końcowego czasu , aby obliczyć różnice ?
Implementacja przedstawia sie nastepujaco:

// importy 

public class Klasa extends JPanel implements ActionListener, KeyListener {

	protected JButton JButton1;

	long wykonanie= 0;
	long poczatek = 0; 
	long koniec = 0;
	public Klasa() {		
			JButton1 = new JButton("JButton ");
		addKeyListener(new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent e) {
		
				if (e.getKeyCode() == KeyEvent.przycisk) {
					poczatek = System.currentTimeMillis();
					// rysuje 				

				}
				koniec = System.currentTimeMillis();
				wykonanie = koniec - poczatek;
				JButton1.setLabel(String.valueOf(wykonanie));
				System.out.println("Czas wykonania = " + wykonanie);
			}
		});			
		add(JButton1);
	}
}

Po implementacji rysowania obiektu i odświeżania tez wstawiałam, ale bez rezultatu nadal czas jest nie poprawny. Jakąś wskazówkę można poprosić, jak rozwiązać poprawnie ten mechanizm...

1

Może pobieraj jeden czas w keyPressed(), a drugi w KeyReleased().

0

Nie wiem jak wyglada twoj kod po tych zmianach, ale zapewne chodzi o to ze operujesz na liczbach calkowitych. Jezeli 27 podzielisz na 1000 to otrzymasz 0.027 ale jako ze typ long nie zachowuje liczb po przecinku to przerzutuje to na liczbe 0. Przed dzieleniem musisz przerzutowac na jakis typ zmiennoprzecinkowy i zapisac w zmiennej zmiennoprzecinkowej, np:

long a = 27;
double b = (double)a/1000;
0

tak mam wykonane , na początku jest metoda *keyPressed * następnie keyReleased :

co do konwersji na double masz racje , tylko mi zwąca identyczny czas :( :( :( :( (minimalna różnica, ostatnia cyfra się najczęściej rożni ). Mam tak:

addKeyListener(new KeyAdapter() {
	@Override
		public void keyPressed(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.przycisk) {
				poczatek = System.currentTimeMillis();
				p = (double) poczatek / 1000;
				System.out.println("Czas poczatek = " + poczatek);
			}
		}
	});

	addKeyListener(new KeyAdapter() {
	     @Override
	        public void keyReleased(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.przycisk) {

			       koniec = System.currentTimeMillis();
				k = (double) koniec / 1000;
				System.out.println("Czas koniec = " + koniec);
				// rysunek 				
				r = (k - p);			
				System.out.println("Czas wykonania " + r);
			}

		}

	});

dla przykładu zwraca mi następujące wartości:

Czas poczatek = 1364840378489
Czas koniec = 1364840378817
Czas wykonania 0.3279998302459717
0

Przecież napisałem: podziel różnicę przez 1000.0

0

to nie zmienia faktu

remainder = (koniec - poczatek) /1000.0;

zwraca:

Czas poczatek = 1364840794160
Czas koniec = 1364840794280
Czas wykonania 0.0

bo jest identyczny czas początku i końca

po prostu pobranie czasu z *keyPressed * i *keyReleased *nie rozwiązuje działania arytmetycznego ... :( :( :( :(

0

Rozwiązuje.

public void keyPressed(KeyEvent ke)
{
    if(!hold)
    {
        poczatek = System.currentTimeMillis();
        hold = true;
    }
...
public void keyReleased(KeyEvent ke)
{
       koniec = System.currentTimeMillis();
       hold = false;
0

nieeeeee rozwiązuje, po co ten *boolean * ? :) :) :) :)

to samo:

Czas poczatek = 1.364843953548E12
Czas poczatek = 1.364843953548E12
Czas poczatek = 1.364843953548E12
Czas poczatek = 1.364843953548E12
Czas poczatek = 1.364843953548E12
Czas poczatek = 1.364843953548E12
Czas koniec = 1.364843954203E12
Czas wykonania 0.655
0

Rozwiązuje, boolean jest po to żeby zapamiętać tylko moment naciśnięcia klawisza.
Coś spieprzyłeś, tekst

Czas poczatek = 1.364843953548E12

powinien pojawić się tylko jeden raz.

0
kasiaKasia napisał(a):

to dlaczego początek z końcem jest identyczny ?

przecież nie jest :|

w jednym masz końcówkę 3548 a w drugim 4203 - czyli trzymałaś klawisz przez 655 milisekund (0 wyrażając w sekundach)

nie wiem czemu własnie się powiela , mam kilka metod keyPressed i keyReleased , ale obsługują inne klawisze

to może pokaż swój kod w całości...

0

po części tak wygląda:


// importy

import javax.swing.*;

public class Class1 extends JPanel implements ActionListener, KeyListener {

protected JButton  button11;
boolean hold;
double remainder = 0;	
double poczatek = 0;
double koniec = 0;

public Class1() {

	setFocusable(true);
	setLayout((LayoutManager) new BoxLayout(this, BoxLayout.Y_AXIS));
	
	button11 = new JButton("button11");
	addKeyListener(new KeyAdapter() {
		@Override
		public void keyPressed(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.przycisk) {
				if(!hold)    {				       
				poczatek = System.currentTimeMillis();
				System.out.println("Czas poczatek = " + poczatek);  
                                hold = true;
			    }
			}
		}
	});

	addKeyListener(new KeyAdapter() {
		@Override
		public void keyReleased(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.przycisk) {
				koniec = System.currentTimeMillis();
				System.out.println("Czas koniec = " + koniec);					
				hold = false;				
			}
			remainder = (koniec - poczatek) / 1000.0;		
			System.out.println("Czas wykonania " + remainder);
			
		}
	});	
	
	add(button11);

}

}

wszystko szlo ładnie, ale ten czas to jakoś bardzo powolutku :(

0

dziękuje serdecznie za pomoc. Działa, tylko użyłam klasy Date() , można tez zastosować System.currentTimeMillis(); deklarując zmienne jako *double * i dzieląc na przez 1000.0 uzyskuje się tylko sekunty

public class Class1 extends JPanel implements ActionListener, KeyListener {

protected JButton  button1;
boolean hold;
	
long w = 0;
Date koniec1;
Date poczatek1;

public Class1() {
	
	setFocusable(true);
	// ustawienie przyciskow w pionie
	setLayout((LayoutManager) new BoxLayout(this, BoxLayout.Y_AXIS));
	button1 = new JButton("button1");
	addKeyListener(new KeyAdapter() {
		@Override
		public void keyPressed(KeyEvent e) {

		if (e.getKeyCode() == KeyEvent.przycisk) {
			if (!hold) {
				DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM);
				df.setTimeZone(TimeZone.getTimeZone("GTM"));

				poczatek1 = new Date();
				System.out.println("Czas poczatek = "+ df.format(poczatek1));
				hold = true;
			}
		}

	}
});

	addKeyListener(new KeyAdapter() {
		@Override
		public void keyReleased(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.przycisk) {
		// rysunek
			hold = false;
		}
		koniec1 = new Date();
		DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM);
		df.setTimeZone(TimeZone.getTimeZone("GTM"));
		System.out.println("Czas koniec = " + df.format(koniec1));
		w = koniec1.getTime() - poczatek1.getTime();
		System.out.println("Czas wykonania w = " + df.format(w));
	}

});

	add(button1);
}

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