2013-04-08 2 views
0

화면 키를 가로 질러 움직이는 일반 JFrame을 원합니다. 그다지 쉬운 일이 아닙니다. 나는 거친 코드 e.getKeyChar()화살표 키로 JFrame을 이동 하시겠습니까?

그것은 가능하다조차 얻을 몇 가지 이유를 들어

? 나는 시작한 이래로 어떻게 든 기술을 재 작성해야한다고 생각하지만, 잘못된 것이있다.

프롬프트 조정 -

public class Main implements Runnable { 
    private int xLocation = 200; 
    private int yLocation = 200; 
    private JFrame frame; 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Main()); 
    } 
    @Override 
    public void run() { 
     KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
     manager.addKeyEventDispatcher(new MyDispatcher()); 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setUndecorated(true); 
     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Label")); 
     panel.add(new JButton(new AbstractAction("Close") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.exit(0); 
      } 
     })); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocation(xLocation, yLocation); 
     frame.setVisible(true); 
    } 
    private class MyDispatcher implements KeyEventDispatcher, KeyListener { 
     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) { 

      char key = e.getKeyChar(); 

      if(key==KeyEvent.VK_LEFT){ 
      } 
      if (e.getID() == KeyEvent.KEY_PRESSED) { 
       //System.out.println("tester"); 
      } else if (e.getID() == KeyEvent.KEY_RELEASED) { 
       //System.out.println("2test2"); 
      } else if (e.getID() == KeyEvent.KEY_TYPED) { 
       //System.out.println("3test3"); 
      } 
      return false; 
     } 
     @Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println("e.getKeyChar() " + e.getKeyChar()); 
      char key = e.getKeyChar(); 
      if (key == KeyEvent.VK_LEFT) { 
       xLocation += 5; 
      } 
      frame.setLocation(xLocation, yLocation); 
      frame.repaint();    
     } 
     @Override 
     public void keyReleased(KeyEvent e) { 
     } 
     @Override 
     public void keyTyped(KeyEvent e) { 
     }   
    } 
} 

답변

2
final JFrame jFrame = new JFrame(); 
    jFrame.getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED), "moveRight"); 
    jFrame.getRootPane().getActionMap().put("moveRight", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      jFrame.setLocation(jFrame.getX() + 5, jFrame.getY()); 
     } 
    }); 
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jFrame.setLocationRelativeTo(null); 
    jFrame.setVisible(true); 

당신이 InputMap/ActionMap 접근을해야보다 당신의 JFrame 내 조상이있는 경우. 공식 guide을 참조하십시오.

관련 문제