2017-12-04 49 views
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"); 
     } 
    } 
} 

答えて

0

問題解決...

textField.setFocusable(true);textField.setFocusable(false);

+1

に変更する必要があります。 – camickr

関連する問題