Permalänk
Medlem

Prog B + KeyListener

Hej,

Undrar om någon skulle kunna förklara hur själva KeyListener i Java fungerar.

Håller på med en fråga jag har fastnat på och problemet är väl att jag inte riktigt fattar hur man ska deklarera de olika "strängarna" för att klara uppgiften.

Uppgiften : Jag ska ha två st TextFields (10) där Det första fältet ska omedelbart byta färg på för- och bakgrund när någon av tangenterna R,G eller B trycks ned. Det andra fältet är normalt.

När fältet byter färg kan vi sätta texten till " RGB ändrar färg" .

Tacksam för snabba svar då jag vill lära mig så snabbt som möjligt

Visa signatur

Desktop: Case: Loque - Ghost S1 MK2 + L-Top Hat | MB: ASRock Z390 Phantom Gaming-ITX/ac | GK: Gigabyte GeForce RTX 2070 8GB GAMING OC | CPU: Intel Core i7 9700K @ Stock | PSU: Corsair SF600 v2 | RAM: Corsair Vengeance LPX DDR4 3200MHz 2x8GB | SSD: Samsung 970 EVO 500GB | Watercooling: NZXT Kraken X52 (2xNoctua NF-A12x25 PWM)| [Win 10 x64].

Permalänk
Medlem

Nu var det ett tag sedan jag programmerade Java och har ingen kompilator framme just nu men något i stil med detta borde fungera:

JTextField tf = new JTextField(); tf.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_R || e.getKeyCode() == KeyEvent.VK_G || e.getKeyCode() == KeyEvent.VK_B) { Color bgColor = Color.WHITE, fgColor = Color.BLACK; if(e.getKeyCode() == KeyEvent.VK_R) { bgColor = Color.RED; fgColor = Color.GREEN; } if(e.getKeyCode() == KeyEvent.VK_G { bgColor = Color.GREEN; fgColor = Color.BLUE; } if(e.getKeyCode() == KeyEvent.VK_B) { bgColor = Color.BLUE; fgColor = Color.RED; } tf.setBackground(bgColor); tf.setForeground(fgColor); tf.setText(" RGB ändrar färg "); } } });

Permalänk
Medlem

hehe joo men du verkar fortfarande kunna en del

skulle hjälpa om du kunde förklara lite också , då jag inte kan så jätte mkt om dessa funktioner

Visa signatur

Desktop: Case: Loque - Ghost S1 MK2 + L-Top Hat | MB: ASRock Z390 Phantom Gaming-ITX/ac | GK: Gigabyte GeForce RTX 2070 8GB GAMING OC | CPU: Intel Core i7 9700K @ Stock | PSU: Corsair SF600 v2 | RAM: Corsair Vengeance LPX DDR4 3200MHz 2x8GB | SSD: Samsung 970 EVO 500GB | Watercooling: NZXT Kraken X52 (2xNoctua NF-A12x25 PWM)| [Win 10 x64].

Permalänk
Medlem

I korthet fungerar det så här:

En s.k. KeyboardFocusManager, som tar hand om alla tangenttryckningar som sker i ett Java-program, delegerar en tangenttryckning till den komponent som för närvarande har fokus, t.ex. ett JTextField.

Textfältet får tangenttryckningen och reagerar på den.

Sedan kollar textfältet om någon annan är intresserad av att få veta att just det har tagit hand om en tangenttryckning. Den går då igenom sin lista av KeyListeners, och anropar var och en av dem med ett KeyEvent som berättar vad som hänt.

Sedan finns det tre olika typer av tangentbordshändelser: pressed, typed och released. Pressed sker före typed, som sker före released. Endast tangenttryckningar som genererar ett tecken (t.ex. <T> men inte <Ctrl>), ger upphov till en typed-händelse.

Och i själva verket skickar textkomponenter ut pressed- och typed-händelser till alla lyssnare innan den uppdaterar sitt interna tillstånd (sitt dokument/sin text). Detta gör att man i en lyssnare kan anropa consume() på det inskickade KeyEventet och därmed "äta upp" händelsen, för att t.ex. hindra någon från att skriva in andra tecken än siffror i ett textfält. (Även om det finns bättre sätt att lösa just den biten.)

Och sedan finns det InputMap/ActionMap, och för textkomponenter kan man även ha DocumentListeners, som båda kan vara bättre än KeyListeners i många fall... men det kanske vi kan lämna så länge.