2013-08-20 3 views
3

У меня есть приложение java, и я хочу дождаться нажатия клавиши для выполнения другого действия. До сих пор я нашел:Дождитесь нажатия клавиши внутри цикла

public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     //Right arrow key code 
    } 
} 

, но я хочу, чтобы это было внутри цикла или что-то, что не ждет, пока ключевые матчи.

Пожалуйста, помогите.

UPDATE:

Я хочу, чтобы программа будет ждать, пока клавиша не будет нажата, и при ее нажатии я хочу, чтобы вызвать другое действие. Например:

public void something(){ 
    //do something 
    wait until a key is pressed 
    if(key pressed is a arrow key){ 
    something(); 
    }else{ 
    wait for the key to be pressed 
    } 
} 

public void dootherthing(){ 
//do other thing 
} 

Я работаю в разгаре, и я не хочу, чтобы GUI безответственными. т. е. когда я вызываю dootherthing одним нажатием кнопки. Он должен это сделать, и ожидание должно закончиться.

+0

Попробуйте что-то вроде: - если (ButtonPress) сделано = true; !!! –

+0

Почему вы хотите, чтобы это было в цикле? –

+0

Вы не можете ждать в цикле в контексте события Dispatching Thread. Это предотвратит обработку новых событий, то есть вы никогда не покинете свой цикл ... возможно, вам следует поделиться тем, что вы пытаетесь сделать, и мы сможем помочь вам найти решение. – MadProgrammer

ответ

3

Свинг (и большинство графических интерфейсов) - это среда, управляемая событиями. То есть что-то происходит, вы реагируете на него.

Имея петлю, ожидающую какого-либо действия, это своего рода счетчик интуитивно понятный (ИМХО).

Вообще-то, вы должны избегать KeyListener s, если можете. У них есть проблемы с основным фокусом. У API key bindings есть способы преодолеть это ограничение.

Это позволяет зарегистрировать KeyStroke против Action и позволяет вашей программе сидеть сложа руки и ждать, пока что-то случится ...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.LineBorder; 

public class KeyBindings { 

    public static void main(String[] args) { 
     new KeyBindings(); 
    } 

    public KeyBindings() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 

      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 1; 
      gbc.gridy = 0; 

      add(new KeyPane(KeyEvent.VK_UP, 0), gbc); 

      gbc.gridy = 2; 
      add(new KeyPane(KeyEvent.VK_DOWN, 0), gbc); 

      gbc.gridx = 0; 
      gbc.gridy = 1; 
      add(new KeyPane(KeyEvent.VK_LEFT, 0), gbc); 

      gbc.gridx = 2; 
      add(new KeyPane(KeyEvent.VK_RIGHT, 0), gbc); 

     } 
    } 

    public class KeyPane extends JPanel { 

     public KeyPane(int keyCode, int modifier) { 

      setBorder(new LineBorder(Color.DARK_GRAY)); 

      InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
      ActionMap am = getActionMap(); 

      im.put(KeyStroke.getKeyStroke(keyCode, modifier, false), "keyPressed"); 
      im.put(KeyStroke.getKeyStroke(keyCode, modifier, true), "keyReleased"); 

      am.put("keyPressed", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        setBackground(Color.RED); 
       } 
      }); 

      am.put("keyReleased", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        setBackground(UIManager.getColor("Panel.background")); 
       } 
      }); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(20, 20); 
     } 
    } 

} 
+0

Спасибо. Это помогло. – sushilthe

+0

Приятно было использовать: D – MadProgrammer

0

Вы можете написать ключ слушателя

я нашел учебник Java, который включает в себя образец Java Webstart и исходный код. Похоже, победителем является KeyEvent.getKeyLocation()

KeyEvent.KEY_LOCATION_STANDARD 
KeyEvent.KEY_LOCATION_LEFT 
KeyEvent.KEY_LOCATION_RIGHT 
KeyEvent.KEY_LOCATION_NUMPAD 
KeyEvent.KEY_LOCATION_UNKNOWN 

Ссылки:
How to tell which SHIFT key was pressed?

+0

Как это связано? – MadProgrammer

0

Keypressed метод всегда будет вызываться всякий раз, когда клавиша нажата, то почему бы вам это нужно, чтобы быть внутри цикла ? Из описания кажется, что вы разрабатываете типизирующую игру, если это так, что вы можете использовать класс Timeline в JavaFX.

Я разработал очень simple typing game в JavaFX, чтобы посмотреть на него (код не организован правильно).

Смежные вопросы