2011-04-26 3 views
1

내 애플릿을 호스트하는 JFrame이 있습니다. 애플릿에는 화살표 키와 엔터/이스케이프 키를 처리하는 KeyListener가 있습니다.수출 후 java 키리스트가 작동하지 않습니다.

Eclipse에서 JFrame을 실행하면 모든 것이 올바르게 작동하고 화살표 키가 입력 및 이스케이프 키와 함께 응답합니다.

그러나 프로젝트를 실행 가능한 Jar 파일로 내보낼 때 화살표 키는 계속 작동하지만 입력 및 이스케이프 키는 작동하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

메인 클래스의 코드 : FinalSnake 애플릿에서

public static void main(String[] args) throws Exception { 
    new SnakeApp().snake(); 
} 

public void snake() throws Exception { 
    // Set windows look 
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 

    // Create window 
    JFrame window = new JFrame("FinalSnake"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // Add FinalSnake applet 
    FinalSnake finalSnake = new FinalSnake(); 
    finalSnake.init(); 
    finalSnake.start(); 
    window.add(finalSnake); 

    // Set size 
    window.setResizable(false); 
    window.getContentPane().setPreferredSize(new Dimension(FinalSnake.GRIDSIZE * FinalSnake.GRIDX, FinalSnake.GRIDSIZE * FinalSnake.GRIDY)); 
    window.pack(); 

    // Set Icon 
    window.setIconImage(new ImageIcon(this.getClass().getResource("gfx/icon.png")).getImage()); 

    // Center the frame 
    Dimension frameSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    window.setLocation((frameSize.width - window.getSize().width)/2, (frameSize.height - window.getSize().height)/2); 

    // Show the window 
    window.setVisible(true); 

    // And focus the FinalSnake applet 
    finalSnake.requestFocusInWindow(); 
} 

코드 :

@Override 
public void keyPressed(KeyEvent e) { 
    if (this.world == null) { 
     if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_LEFT) { 
      this.gameType--; 

      if (this.gameType == 0) { 
       this.gameType = 2; 
      } 
     } 

     if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      this.gameType++; 

      if (this.gameType == 3) { 
       this.gameType = 1; 
      } 
     } 

     if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE) { 
      this.world = new World(this.gameType); 
     } 
    } else { 
     if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { 
      this.world = null; 
     } 
    } 
} 

희망 누군가가 나를 위해이를 지울 수 있습니다 ... Thnx

+0

왜 'FinalSnake'는'JPanel '이 아닌 애플릿입니까? 패널 인 경우 애플릿 또는 응용 프로그램에 추가 할 수 있으며 포커스 문제가 사라질 가능성이 큽니다. –

답변

0

당신은 시도 할 수 있습니다 KeyEvent 변수에 consume() 메소드를 사용하십시오. 그것은 말한다 :이 을 발생 바탕으로보다 디폴트의 방법 으로 처리되지 않게

이 이벤트를 소비한다.

이렇게하면 기본 방식보다 우선합니다.

public void keyPressed(KeyEvent e) { 
//Do your actions 
e.consume(); 
} 
+0

문제는 입력 및 이스케이프 키에 대해 이벤트가 전혀 호출되지 않고 너무 많이 처리되지 않는다는 것입니다. – FinalFrager

+0

질문 : [stackoverflow] (http://stackoverflow.com/questions/1053673/japplet-not-stopping-or-reacting-to-keyboard-input) 및 [여기] (http : // www. daniweb.com/software-development/java/threads/155991), 아마도 이것이 단서를 얻는 데 도움이 될 것입니다. – JMelnik

+0

별로 ... 내 애플 리케이션 이클립스를 통해 실행하는 동안 100 % 작동 ... 내가 (실행) 배포판에 대한 수출 병에 수출 더 이상 작동하지 않습니다 ... – FinalFrager

관련 문제