2017-12-04 13 views
0

내 패널을 만들고 올바르게 키 바인딩을 설정하는 데 문제가 있습니다. 내 JFrame에 JTextField를 추가하면 키 바인딩이 작동을 멈 춥니 다. 예를 들어 여기에 SSCCE이 내 문제를 보여줍니다. JTextField가 포함 된 줄을 주석으로 지정하면 p을 원하는대로 작동합니다. 왜 이런 일이 일어나고 어떻게 해결할 수 있습니까? 그냥 다음 텍스트를 표시 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

관련 문제