Odchycení kláves 2-0 v Javě

nuda

Odchycení kláves 2-0 v Javě
« kdy: 05. 08. 2013, 12:27:08 »
Zdravim...

mam takyto problem:
- nemozem v jave odchytit klavesy od 2 po 0 a niektore dalsie klavesy (resp. vsetky ktore maju aj nejaky lokalny symbol)
- KeyEvent.getKeyCode pre tieto klavesy hadze 0 (0x0 unknown)
- vsetky ostatne klavesy funguju korektne...
- zmena lokalneho nastavenia klavesnice v Kubuntu nepomaha...
- zmena lokalneho nastavenia klavesnice priamo v kode aplikacie pod linuxom cez selectInputMethod nefunguje... aplikacia sa vzdy spusti s "en, US" klavesnicou...
- pod widlami ide rovnaka aplikacia spravne a odchyti vsetky klavesy...

OS: Kubuntu 12.04
« Poslední změna: 05. 08. 2013, 20:09:20 od Petr Krčmář »


haff

Re:Odchytenie klaves 2-0 v jave pod linuxom
« Odpověď #1 kdy: 05. 08. 2013, 12:39:43 »
setxkbmap sk-qwerty ?

nuda

Re:Odchytenie klaves 2-0 v jave pod linuxom
« Odpověď #2 kdy: 05. 08. 2013, 12:53:59 »
to je mi nanic... ja nepotrebujem menit nastavenie klavesnice v linuxe... ja potrebujem zabezpecit aby som v aplikacii napisanej v jave mohol zachytit klavesy, ktore maju nejaky lokalny symbol(ľščťžýíéäň) Klavesnicu v linuxe som skusal zmenit ci to nahodu nezachyti, ale nema to vplyv... nejde mi o pisanie do nejakych formularov alebo podobne, potrebujem skratka aby mi tento kod zachytil klavesy:

if(e.getKeyCode()==KeyEvent.VK_A){System.out.print("VK_A");}
if(e.getKeyCode()==KeyEvent.VK_2){System.out.println("VK_2");}
if(e.getKeyCode()==KeyEvent.VK_3){System.out.println("VK_3");}
if(e.getKeyCode()==KeyEvent.VK_4){System.out.println("VK_4");}

acko zachyti korektne, 2,3,4 nie... a o to mi ide...

rik

Re:Odchytenie klaves 2-0 v jave pod linuxom
« Odpověď #3 kdy: 05. 08. 2013, 22:20:35 »
to je mi nanic... ja nepotrebujem menit nastavenie klavesnice v linuxe... ja potrebujem zabezpecit aby som v aplikacii napisanej v jave mohol zachytit klavesy, ktore maju nejaky lokalny symbol(ľščťžýíéäň) Klavesnicu v linuxe som skusal zmenit ci to nahodu nezachyti, ale nema to vplyv... nejde mi o pisanie do nejakych formularov alebo podobne, potrebujem skratka aby mi tento kod zachytil klavesy:

if(e.getKeyCode()==KeyEvent.VK_A){System.out.print("VK_A");}
if(e.getKeyCode()==KeyEvent.VK_2){System.out.println("VK_2");}
if(e.getKeyCode()==KeyEvent.VK_3){System.out.println("VK_3");}
if(e.getKeyCode()==KeyEvent.VK_4){System.out.println("VK_4");}

robis to blbo. chces testovat ščťž... (slovenska klavesnica) ale v kode testujes 2345... (anglicka klavesnica). bud si v java kode natvrdo zmen pre tvoj kod lokalizaciu klavesnice (tu swing aplikacia):
yourMainJFrame.getInputContext().selectInputMethod(new Locale("fa", "IR"));

alebo netestuj cez VK_ ale znak ktory v danej lokalizacii dana klavesa vracia:
event.getKeyText().equals("š");

program sa nemoze spoliehat na to, ze pocas behu bude zapnuta anglicka klavesnica (tvoj kod).

have fun

nuda

Re:Odchycení kláves 2-0 v Javě
« Odpověď #4 kdy: 05. 08. 2013, 22:58:10 »
:fp:

dobre z prech. prispevku nie je jasne ake klavesy chcem, takze skusim inak vysvetlit... pisem multiplatformny program (hlavny os je linux) multi-jazycny, kde sa bude pouzivat vela klaves, ale nie na pisanie... medzi inymi aj cisla nad pismenami... problem je, ze mi java tieto klavesy neodchyti(klavesy s cislami a lokalnymi pismenami)... program musi byt univerzalny, bez nastavovania a pod. (bfu klientela)... pre funkcnost nepotrebujem vediet ci bolo stlacene š alebo 3, obe su na tej istej klavese, takze je mi to jedno... dolezite je to stlacenie a k tomu sa nemozem dopracovat... pretoze, pri stlaceni 2,3,4,5,6,7,8,9,0 a dalsich hadze 0 - undefined...

Takze poradi mi niekto co s tym ?

Dalej:
- selectInputMethod pod linuxom nefunguje... s tym si nepomozem
- testovat 'š' sice funguje ale je nepripustne, pretoze to nefunguje na ostatnych klavesniciach...
- problem je, ze klavesy nedochyti ani ked je klavesnica anglicka a testujem cisla...
- vo windowse vsetky klavesy korektne odchyti, bez 0 a bez nastavovania klavesnice


Lol Phirae

Re:Odchycení kláves 2-0 v Javě
« Odpověď #5 kdy: 05. 08. 2013, 23:16:51 »
Vyrabis falesnou klavesnici na bankomat nebo co? Amatere...  ;D :-*

Re:Odchycení kláves 2-0 v Javě
« Odpověď #6 kdy: 06. 08. 2013, 08:03:34 »
Za prvé, pokud jste ještě neobjevil příkaz switch, do nízkoúrovňového programování bych se být vámi nepouštěl.

Za druhé, vůbec nepíšete, jakým způsobem klávesy zachytáváte. Na úrovni operačního systému je to tak, že se detekuje stisknutí a uvolnění klávesy, a posílá se kód konkrétní klávesy. O úroveň výš se pak dělá mapování na znaky – takže třeba kombinace dvou kláves se přemapuje na jeden znak, řeší se opakování znaku při držení klávesy atd. Nad tímhle vším pak je ještě Java, která to zase zevšeobecňuje pro multiplatformní programy. Takže je otázka, co všechno je v Javě dostupné.

Za třetí, když si přečtete JavaDoc (bez toho se vůbec nepouštějte do programování v Javě), dočtete se tam, že máte zpřístupněné ty výše zmíněné dvě úrovně. KeyCode se posílá jen při stisknutí a uvolnění klávesy (nižší úroveň zpracování), při události keyTyped už je nastaven na nulu (protože došlo k mapování na znaky a znak je často výsledkem stisku více kláves). A přesně takhle mi to také funguje. Můžete si to sám vyzkoušet:
Kód: [Vybrat]
public class KeyEventTest extends JFrame implements KeyListener {

  @Override
  public void keyTyped(KeyEvent event) {
    printEvent("Typed", event);
  }

  @Override
  public void keyPressed(KeyEvent event) {
    printEvent("Pressed", event);
  }

  @Override
  public void keyReleased(KeyEvent event) {
    printEvent("Released", event);
  }

  private void printEvent(String eventName, KeyEvent event) {
    System.out.println(String.format("%s: %c %d %d", eventName, event.getKeyChar(), event.getKeyCode(), event.getKeyLocation()));
  }

  public static void main(String[] args) {
    new KeyEventTest().setVisible(true);
  }

  public KeyEventTest() throws HeadlessException {
    super("KeyEvent");
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setMinimumSize(new Dimension(200, 200));
    addKeyListener(this);
  }
}

nuda

Re:Odchycení kláves 2-0 v Javě
« Odpověď #7 kdy: 06. 08. 2013, 10:01:58 »
1.) ...
2.) pri keyPressed porovnam getKeyCode s VK_<nieco>, keyReleased, keyTyped ma nezaujima...
3.) ...

program pekny to je pravda, aj som dosiel k tomu, ze zmena klavesnice zmeni vystup na getKeyChar... lenze... radsej skusim napisat vystup (testujeme klavesu 3 na ktorej je nakreslene aj š... presnejsie, klavesa nad klavesami W a E):

windows 7 64 EN:
Pressed: 3 51 1
Typed: 3 0 0
Released: 3 51 1
- nemam problem, vystup pri keyPressed z getKeyCode porovnam s VK_3, ostatne ma nezaujima

windows 7 64 EN:
Pressed: š 51 1
Typed: š 0 0
Released: š 51 1
- nemam problem, vystup pri keyPressed z getKeyCode porovnam s VK_3, ostatne ma nezaujima

Kubuntu 12.04 EN:
Pressed: 3 0 1
Typed: 3 0 0
Released: 3 0 1
- mam problem, vystup pri keyPressed z getKeyCode je nula, takze nemozem porovnavat s VK_3, vsetky dalsie klavesy od 4... po 9 davaju tiez nulu, takze ich nerozoznam...

Kubuntu 12.04 SK:
Pressed: š 0 0
Typed: š 0 0
Released: š 0 0
- mam problem, vystup pri keyPressed z getKeyCode je nula, takze nemozem porovnavat s VK_3, vsetky dalsie klavesy od 4... po 9 davaju tiez nulu, takze ich nerozoznam...

Dufam, ze teraz uz je trochu jasnejsie kde je problem...
Mohol by som testovat getKeyChar, ale je to trochu pracne ked to mam lokalizovat pre nemecko, polsko, cesko a bohvie kde to vsade pojde ?  Dobra moznost by bola, aby si program vynutil napr. en a testoval by som len getKeyChar 234567890... ale na linuxe mi to nechce fungovat...

Takze otazka znie: je toto korektne fungovanie ? Co s tym, aby som mohol reagovat pri stlaceni tychto klaves (234567890+nejake dalsie) nezavisle od nastavenie klavesnice a OS... ak sa neda urobit univerzalne ako radite riesit problem ?

PS: nejake drobne rozdiely v hodnotach si nevsimajte,

nuda

Re:Odchycení kláves 2-0 v Javě
« Odpověď #8 kdy: 06. 08. 2013, 10:07:17 »
Chybka sa vloudila: pri tom druhom teste pod windowsom, je to samozrejme test s SK... :D

Re:Odchycení kláves 2-0 v Javě
« Odpověď #9 kdy: 06. 08. 2013, 10:27:13 »
Chtělo by to vyzkoušet, zda to v tom Linuxu dělá Java, nebo XKB. Určitě bych se podíval na výstup příkazu xev – ale ten myslím zobrazuje vstup do XKB, nikoli výstup, takže pokud bude zobrazovat kódy správně, ještě to nemusí znamenat, že problém není v XKB. Možná v XKB budou další utility, se kterými půjde zjistit, co z XKB leze.

Pokud zjistíte, že z XKB lezou očekávaná data, a zkazí to až Java, bude podle mne ještě důležité, zda je to „originál“ Java od Oracle, nebo zda je to třeba OpenJDK.

Re:Odchycení kláves 2-0 v Javě
« Odpověď #10 kdy: 06. 08. 2013, 11:56:23 »
sice ti neporadim, ale asi nejsi jediny kdo s tim ma prbolemy: me java aplikace od KB (mojebanka) v ubuntu(oracle java 7 z webupd8 repo) nebere v nekterych polich 1 takze ji musim napsat v geditu a dat ctrl+c a ctrl+v
Děkuji za možnost editace příspěvku.

nuda

Re:Odchycení kláves 2-0 v Javě
« Odpověď #11 kdy: 06. 08. 2013, 12:43:16 »
javu pouzivame original od Oracle, ale ktovie co bude na cielovych pc...
xev vypluje toto(pre 3/š):

SK klav:
KeyPress event, serial 36, synthetic NO, window 0x4200001,
    root 0xbe, subw 0x0, time 2774059, (88,48), root:(774,419),
    state 0x10, keycode 12 (keysym 0x1b9, scaron), same_screen YES,
    XLookupString gives 2 bytes: (c5 a1) "š"
    XmbLookupString gives 2 bytes: (c5 a1) "š"
    XFilterEvent returns: False
EN klav:
KeyRelease event, serial 36, synthetic NO, window 0x4200001,
    root 0xbe, subw 0x0, time 3076339, (478,343), root:(538,603),
    state 0x2010, keycode 12 (keysym 0x33, 3), same_screen YES,
    XLookupString gives 1 bytes: (33) "3"
    XFilterEvent returns: False

podla wiki "keycode" je to co pride zo zariadenia do X, a keysym spolu so stringom(scaron/3) je to co X posle dalej do aplikacie - aspon pokial som to spravne pochopil... dalej je tam dost podstatna veta, ze keysym je urcene iba pre niektore klavesy (enter,esc, f1-f12 a pod.), pre vsetky ostatne klavesy sa pouziva string... cize asi tu je pes zakopany, a java nevycita z keysym hodnotu ale zoberie iba ten string... divne je, ze abecedu precita aj z keysymom, ale zrejme je problem v tej lokalizacii... takze zrejme to pod linuxom predsa len ide tak ako ma...

OK, dik za nasmerovanie... riesit sa to bude tak, ze sa najprv otestuje ako to pojde pod inymi distrami (ci nieje problem v tej verzii XKB v Kubuntu 12.04), a potom sa zrejme urobi iba testovanie pri en,US klavesnici, a BFU si to prepnu... :D Moc sa mi to nepaci, ale co uz... :D