Я знаю, что я разместил предыдущие вопросы по этой теме, но я размещаю новый здесь, потому что я создал MCVE, который мне нужен. Вот этот класс, который может воспроизвести проблему (если вы скопируете и вставьте этот код в свой редактор Java (но измените имя пакета), то он сможет успешно запускаться без проблем. Это полная тестовая программа):Keybindings случайно перестают работать из-за потери фокуса, может быть?
package com.blockhead7360.test.ppa;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
public class TotalKeyTest {
static JTextArea area;
static int i = 0;
public TotalKeyTest(){
JFrame frame = new JFrame("Test");
frame.setPreferredSize(new Dimension(600, 600));
frame.setMaximumSize(new Dimension(600, 600));
frame.setMinimumSize(new Dimension(600, 600));
JComponent comp = (JComponent) frame.getContentPane();
frame.getRootPane().getRootPane().setActionMap(bindKeys(comp).getActionMap());
frame.getRootPane().getRootPane().setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW, bindKeys(comp).getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static JComponent bindKeys(JComponent comp){
comp.getInputMap().put(KeyStroke.getKeyStroke("pressed SPACE"), "pressSpace");
comp.getActionMap().put("pressSpace", new AbstractAction(){
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e){
System.out.println("pressed Space");
}
});
comp.getInputMap().put(KeyStroke.getKeyStroke("pressed A"), "pressLeft");
comp.getActionMap().put("pressLeft", new AbstractAction(){
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e){
System.out.println("pressed left");
}
});
comp.getInputMap().put(KeyStroke.getKeyStroke("released A"), "releaseLeft");
comp.getActionMap().put("releaseLeft", new AbstractAction(){
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e){
System.out.println("released left");
}
});
comp.getInputMap().put(KeyStroke.getKeyStroke("D"), "pressRight");
comp.getActionMap().put("pressRight", new AbstractAction(){
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e){
System.out.println("pressed right");
}
});
comp.getInputMap().put(KeyStroke.getKeyStroke("released D"), "releaseRight");
comp.getActionMap().put("releaseRight", new AbstractAction(){
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e){
System.out.println("released right");
}
});
return comp;
}
public static void main(String args[]){
new TotalKeyTest();
}
}
Если вы хотите его как Pastebin, вот оно: http://pastebin.com/EhPJeAPC
в основном то, что происходит, когда я нажимаю пространство, и ключи D несколько раз в начале (короткие и длинные прессы), оно работает. После нескольких коротких и длинных нажатий он просто перестает работать!
Может кто-нибудь помочь?
EDIT: BTW Я знаю, что код включает frame.getRootPane() вместо того, чтобы просто использовать frame.add(), но это было там, потому что я пытался кое-что изложить. Я могу изменить его, если хочешь.
EDIT: Я узнал, что он отлично работает, если я использую клавиши со стрелками вместо клавиш A и D. Я не знаю, почему, но я собираюсь бросить это.
(1-) и что происходит, когда вы тестируете рабочий код, который был предоставлен вам в вашем предыдущем вопросе ??? Почему вы ожидаете от нас отладки вашего кода, когда вам уже предоставлен рабочий код? Поэтому вместо того, чтобы мы потратили время на тестирование кода. Вы тратите время на тестирование нашего кода. Если наш код не работает, возможно, проблема с версией/платформой. – camickr
'Я узнал, что он отлично работает, если я использую клавиши со стрелками' - как вы это узнали? Вы наконец-то протестировали ранее данный код? – camickr