czas naciśnięcia przycisku - Java

czas naciśnięcia przycisku - Java
kasiaKasia
  • Rejestracja:ponad 14 lat
  • Ostatnio:7 dni
  • Postów:259
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:

Kopiuj
// 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...


edytowany 1x, ostatnio: kasiaKasia
bogdans
Moderator
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 5 lat
1

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


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
kasiaKasia
dziękuje, już sprawdzam :) :) :) :)
kasiaKasia
dziękuje ślicznie działa :) :) :) :) Jedno tylko jeszcze pytanko zwraca to w nanosekundach , a chciałbym w sekundach. Jaka to metoda? System.....?
bogdans
To zwraca w milisekundach ( a nie w nanosekundach). Podziel różnicę przez 1000.0
kasiaKasia
coś nie tak nadal , hmm. Po testuje :) :) :) :)
M3
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:104
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:

Kopiuj
long a = 27;
double b = (double)a/1000;
edytowany 3x, ostatnio: michat34
unikalna_nazwa
ale chodzi o sekundy z milisekund więc co najwyżej dzieli 27999 przez 1000 i wychodzi 27. Czyli tylko zaokrągla w dół sekundy ale ogólnie dalej działa
bogdans
@michat34, po co takie sztuczki, napisałem wyżej podziel przez 1000.0
kasiaKasia
  • Rejestracja:ponad 14 lat
  • Ostatnio:7 dni
  • Postów:259
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:

Kopiuj
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:

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

edytowany 1x, ostatnio: kasiaKasia
bogdans
Moderator
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 5 lat
0

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


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
kasiaKasia
  • Rejestracja:ponad 14 lat
  • Ostatnio:7 dni
  • Postów:259
0

to nie zmienia faktu

Kopiuj
remainder = (koniec - poczatek) /1000.0;

zwraca:

Kopiuj
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 ... :( :( :( :(


edytowany 2x, ostatnio: kasiaKasia
unikalna_nazwa
co znaczy "rozwiązywać różnicę"?
bogdans
Moderator
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 5 lat
0

Rozwiązuje.

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

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
kasiaKasia
  • Rejestracja:ponad 14 lat
  • Ostatnio:7 dni
  • Postów:259
0

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

to samo:

Kopiuj
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

edytowany 1x, ostatnio: kasiaKasia
bogdans
Moderator
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 5 lat
0

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

Kopiuj
Czas poczatek = 1.364843953548E12

powinien pojawić się tylko jeden raz.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
kasiaKasia
to dlaczego początek z końcem jest identyczny ?
bogdans
W poprawnie napisanym kodzie początek różni się (i to bardzo) od końca, ja uzyskałem czas kilkuminutowy.
kasiaKasia
nie wiem czemu własnie się powiela , mam kilka metod keyPressed i keyReleased , ale obsługują inne klawisze
unikalna_nazwa
inne klawisze ale pewnie korzystają z tych samych zmiennych "poczatek" i "koniec"? ;>
kasiaKasia
ok, wyświetla się raz czas początkowy, ale końcowy nadal ten sam ojejku
unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
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...


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 2x, ostatnio: unikalna_nazwa
kasiaKasia
zamęt tam jest, chwileczka
kasiaKasia
  • Rejestracja:ponad 14 lat
  • Ostatnio:7 dni
  • Postów:259
0

po części tak wygląda:

Kopiuj

// 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 :(


edytowany 6x, ostatnio: kasiaKasia
kasiaKasia
światło mi wyłączyli wczoraj i całemu osiedlu , ehh
kasiaKasia
  • Rejestracja:ponad 14 lat
  • Ostatnio:7 dni
  • Postów:259
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

Kopiuj
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);
}

edytowany 6x, ostatnio: kasiaKasia
bogdans
Kręcisz dziewczyno, wczorajszy kod (ten z System.currentTimeMillis()) też działa.
kasiaKasia
tak tez działa :) :) :) :) dziękuje ślicznie
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)