0
パネルの作成とキーバインディングの設定に問題があります。 JFrameにJTextFieldを追加すると、キーバインディングが機能しなくなります。例えば、SSCCEが私の問題を示しています。もしあなたが希望の通りにp
を押してJTextFieldを含む行をコメントするならば。なぜこれが起こり、これをどうやって修正するのですか?あなたはちょうどそのテキストを表示するJLabelを使用したい場合はJTextFieldを追加するとキーバインドが壊れます
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
public class Example{
Example(){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.setResizable(false);
JPanel panel = new JPanel(true);
panel.setBackground(Color.BLACK);
panel.setLayout(new FlowLayout());
panel.setPreferredSize(new Dimension(500, 500));
panel.setBorder(BorderFactory.createEmptyBorder());
panel.setFocusable(true);
frame.add(panel, BorderLayout.SOUTH);
KeyboardInput keyboard = new KeyboardInput(panel);
// adding JTextField corrupts key bindings
JTextField textField = new JTextField();
textField.setPreferredSize(new Dimension(500, 100));
textField.setFont(textField.getFont().deriveFont(15));
textField.setText("text");
textField.setEditable(false);
textField.setFocusable(true);
textField.setBorder(BorderFactory.createEmptyBorder());
textField.setBackground(Color.BLACK);
frame.add(textField, BorderLayout.NORTH);
frame.pack();
frame.setVisible(true);
frame.setLocationRelativeTo(null);
}
public static void main(String[] args){
new Example();
}
}
class KeyboardInput{
KeyboardInput(JPanel panel){
InputMap inMap = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap actMap = panel.getActionMap();
inMap.put(KeyStroke.getKeyStroke("P"), "pauseGame");
actMap.put("pauseGame", new pauseAction());
}
class pauseAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("PAUSE");
}
}
}
に変更する必要があります。 – camickr