2014-04-23 2 views
0

문제가 있습니다. 내 키 바인딩 JDialog의 inputMap에 할당 된 Ctrl + Tab이 작동하지 않습니다.JDialog에서 키 바인딩이 작동하지 않는 이유는 무엇입니까?

이 코드를 복사하여 붙여넣고 Ctrl + Tab을 눌러 문제를보십시오. 그것은 콘솔에 인쇄해야하지만 그렇지 않습니다.

public class PopupFilesAccessor extends JDialog { 

    private static PopupFilesAccessor filesAccessor = new PopupFilesAccessor(); 

    private DefaultListModel<String> filesModel; 
    private JList<String> files; 

    public PopupFilesAccessor() { 
     super(null, "Demo", ModalityType.APPLICATION_MODAL); 
     super.setUndecorated(true); 
     super.setAlwaysOnTop(true); 
     super.setLocationRelativeTo(null); 

     filesModel = new DefaultListModel<>(); 

     files = new JList<>(filesModel); 
     files.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     files.setLayoutOrientation(JList.HORIZONTAL_WRAP); 
     files.setVisibleRowCount(0); 
     // files.setCellRenderer(new FilesListCellRenderer()); 

     InputMap inputMap = super.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     ActionMap actionMap = super.getRootPane().getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.CTRL_DOWN_MASK), "selectDown"); 
     actionMap.put("selectDown", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       selectNextItem(); 
      } 

      private void selectNextItem() { 
       System.out.println("Good! selectNextItem method is running"); 
      } 
     }); 

     JScrollPane scrollBar = new JScrollPane(files); 
     super.getContentPane().add(scrollBar); 
    } 

    private void prepareToShow() { 
     List<String> openedFiles = Arrays.asList("item1", "item2", "item3", "item4", "item5", "item6", "item7"); 
     filesModel.clear(); 
     for (int i = 0; i < openedFiles.size(); i++) { 
      String userFile = openedFiles.get(i); 
      filesModel.addElement(userFile); 
     } 
     files.setSelectedIndex(1); 
     super.pack(); 
    } 

    public static void popup() { 
     filesAccessor.prepareToShow(); 
     filesAccessor.setVisible(true); 
     filesAccessor.requestFocusInWindow(); 
    } 

    public static void main(String[] args) { 
     PopupFilesAccessor.popup(); 
    } 
} 

감사!

+1

Ctrl-Tab은 Windows 및 일부 Linux 배포판의 OS 기능입니다 ... 어떤 OS를 사용하고 있습니까? JFrame과 함께 작동합니까? –

답변

1

좋은 방법은 아니지만 여전히 적합한 경우 ActionEvent#paramString()을 사용해보십시오.

long eventMask = AWTEvent.KEY_EVENT_MASK; 

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 
    public void eventDispatched(AWTEvent e) { 
     String paramString = e.paramString(); 
     // System.out.println(paramString); 
     if (paramString.contains("KEY_RELEASED,keyCode=9,keyText=Tab,keyChar=Tab,modifiers=Ctrl,extModifiers=Ctrl")) { 
      System.out.println("Ctrl+Tab keys are released"); 
     } 
    } 
}, eventMask); 

참고 : param 문자열의 다른 조합도 확인할 수 있습니다.