Nie będę tu wklejał całego kodu programu, bo jest dość długi, ale przestał działać, kiedy zaimplementowałem KeyListener do JPanel. Użyłem też metod setFocusable(true) oraz requestFocusInWindow(). Testowałem też grabFocus(), ale było to samo. Oczywiście nadpisałem keyPressed, keyReleased oraz keyTyped. Program wywala po różnym czasie (od razu po uruchomieniu albo po kilkunastu sekundach), niezależnie czy klikam a i d czy nie. Eclipse daje taki komunikat:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at test1.Klocek1x1.<init>(Klocek1x1.java:25)
at test1.Panel$ZegarTask.actionPerformed(Panel.java:156)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Nie mam pojęcia o co chodzi. Tu daje wyrywek kodu, którego dotyczy problem:
public class Panel extends JPanel implements KeyListener
{
public Panel()
{
this.setFocusable(true);
this.requestFocusInWindow();
this.addKeyListener(this);
//kod
}
@Override
public void keyPressed(KeyEvent evt)
{
char przycisk = evt.getKeyChar();
if(przycisk=='a')
{
//kod
}
if(przycisk=='d')
{
//kod
}
}
@Override
public void keyReleased(KeyEvent evt) { }
@Override
public void keyTyped(KeyEvent evt) { }
}