2015-05-06 3 views
0

у меня KeyHandler здесь:showMessageDialog влияют KeyHandler

private void KeyHandler(java.awt.event.KeyEvent evt) {        
     // TODO add your handling code here: 

     if(evt.getKeyCode() == KeyEvent.VK_UP) 
     { 
      if(menuPosition == 1){ 
       MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_3.png"))); 
       menuPosition = 3; 
      } 
      else if(menuPosition == 2){ 
       MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_1.png"))); 
       menuPosition = 1; 
      } 
      else if(menuPosition == 3){ 
       MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_2.png"))); 
       menuPosition = 2; 
      } 
     } 
     if(evt.getKeyCode() == KeyEvent.VK_DOWN) 
     { 
      if(menuPosition == 1){ 
       MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_2.png"))); 
       menuPosition = 2; 
      } 
      else if(menuPosition == 2){ 
       MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_3.png"))); 
       menuPosition = 3; 
      } 
      else if(menuPosition == 3){ 
       MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_1.png"))); 
       menuPosition = 1; 
      } 
     } 
     if(evt.getKeyCode() == KeyEvent.VK_ENTER) 
     { 
      if(menuPosition == 1){ 
       menuPosition = 5; 
       Container parent = MenuLabel.getParent(); 
       parent.removeAll(); 
       parent.add(NewGamePanel); 
       parent.repaint(); 
       parent.revalidate(); 

      } 
      else if(menuPosition == 2){ 
       menuPosition = 4; 
       MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/readme.png"))); 
      } 
      else if(menuPosition == 3){ 
       System.exit(0); 
      } 
      else if(menuPosition == 4){ 
       MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_1.png"))); 
       menuPosition = 1; 
      } 
     } 
    } 

, а также у меня есть кнопка:

private void backButtonActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add your handling code here: 

     jPanel1.removeAll(); 
     jPanel1.add(MenuLabel); 
     jPanel1.repaint(); 
     jPanel1.revalidate(); 
     menuPosition = 1; 


    } 

Когда JPanel1 является панель моей программы. У меня есть CardLayout там, и когда эта кнопка нажата, я хочу закрыть все, а затем вернуться в свой MenuLabel.

В initComponents порожденных Java есть этот код:

// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    jPanel1 = new javax.swing.JPanel(); 
    MenuLabel = new javax.swing.JLabel(); 
    NewGamePanel = new javax.swing.JPanel(); 
    NewGameHeader = new javax.swing.JLabel(); 
    NewGameBody = new javax.swing.JPanel(); 
    sizeOfField = new javax.swing.JComboBox(); 
    sizeOfFieldLabel = new javax.swing.JLabel(); 
    NewGameOkButton = new javax.swing.JButton(); 
    jLabel1 = new javax.swing.JLabel(); 
    numberOfPlayersCombo = new javax.swing.JComboBox(); 
    backButton = new javax.swing.JButton(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    setTitle("Labyrinth - The Game"); 
    setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); 
    setMinimumSize(new java.awt.Dimension(1000, 650)); 
    setPreferredSize(new java.awt.Dimension(650, 700)); 
    setResizable(false); 
    setSize(new java.awt.Dimension(650, 700)); 
    addKeyListener(new java.awt.event.KeyAdapter() { 
     public void keyPressed(java.awt.event.KeyEvent evt) { 
      KeyHandler(evt); 
     } 
    }); 
    ... 

Забавно, что мой KeyHandler не работает после нажатия на кнопку, однако, когда я ставлю этот простой код в функции backButtonActionPerformed:

JOptionPane.showMessageDialog(null, null); 

keyHandler снова работает. Может ли кто-нибудь сказать мне, почему это так, и как я могу заставить KeyHandler работать снова, не вставляя диалоговое окно сообщений?

Остальная часть кода генерируется Java (некоторые другие коробки и т.д.)

Спасибо.

+0

К какому компоненту вы добавили 'KeyListener'? – Blip

+0

Этот keyListener добавлен в jPanel1, который содержит все остальные компоненты. (есть MenuLabel и NewGamePanel, у которых есть еще одна метка). Но я не уверен, что 100%, потому что его в функции initComponents, сгенерированной Java/NetBeans ... Я добавлю больше кода в исходное сообщение. – Shadowmak

+0

Каков тип класса, в котором вы реализовали вышеуказанный код? – Blip

ответ

1

В функции backButtonActionPerformed(java.awt.event.ActionEvent evt) попробуйте добавить строку

jPanel1.requestFocusInWindow(); 

Befor e строка menuPosition = 1; и попробуйте запустить программу.

+0

К сожалению, не работает. Но проблема может быть в том, что KeyBinding относится ко всему JFrame. EDIT: Я добавил ключевого обработчика в jPanel1, и теперь он отлично работает. Спасибо! – Shadowmak

1

Не используйте KeyListener с, компонентом они зарегистрированы, чтобы потребности иметь фокус клавиатуры и быть фокусируемым

Вместо этого используйте API Key Bindings, который был разработан для преодоления этих ограничений

См How to use Key Bindings

+0

Итак, добавьте привязки клавиш меток и он должен работать правильно? – Shadowmak

+0

Вам нужно будет добавить его к тому, что когда-либо выполнял компонент в меню. Возможно, вам придется добавить его к нескольким компонентам, в зависимости от того, чего вы пытаетесь достичь. – MadProgrammer