2010-12-05 44 views
0

我编写了一个使用多个JPanel的Java小应用程序。一个用于主菜单,一个用于高分列表,一个用于游戏本身,另一个用于最终结束屏幕,用于显示分数并要求用户输入他/她的名字。用多个JPanel保持焦点的Java小应用程序

在Mac OS X上,一旦一个JPanel获得焦点(使用MouseListener或Timer),焦点就可以轻松切换到新的JPanel。但是,在Windows上,您必须单击每个屏幕才能手动重新获得焦点。

我的问题是,是否有一个优雅的跨平台解决方案,始终将焦点放在Applet的最顶级JPanel中,即使顶级JPanel发生了变化?

这里是我做的到JPanels之间切换什么的示例代码:

public void showMainMenu() { 
     if (endScreen != null) { 
      endScreen.stop(); 
      getContentPane().remove(endScreen); 
      endScreen = null; 
     } 

     if (highScoreView != null) { 
      getContentPane().remove(highScoreView); 
      highScoreView = null; 
     } 

     if (gameView != null) { 
      gameView.stop(); 
      getContentPane().remove(gameView); 
      gameView = null; 
     } 

     if (mainMenu == null) {   
      mainMenu = new MainMenu(d, this); 
     } 

     getContentPane().add(mainMenu);  
     forceRequestFocus(); 
     validate(); 
     repaint(); 
    } 

我用一种变通方法,我发现在这里使用非重复的计时器来获取JPanel的焦点尝试,所以用户不必点击它。唯一的问题是,它只能使用一次。新的JPanel替换另一个后,焦点将丢失,只能通过单击鼠标来恢复。

private void forceRequestFocus() { 
    Timer focusTimer = new Timer(5, new RequestFocusActionListener()); 
    focusTimer.setRepeats(false); 
    focusTimer.start(); 
} 

private class RequestFocusActionListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     if (highScoreView != null) { 
      highScoreView.requestFocusInWindow(); 
     } 

     else if (mainMenu != null) { 
      mainMenu.requestFocusInWindow(); 
     } 

     else if (gameView != null) { 
      gameView.requestFocusInWindow(); 
     } 

     else if (endScreen != null) { 
      endScreen.requestFocusInWindow(); 
     } 
    } 
} 

回答

0

好吧,我想通了。我可以使用Timer获得第一个JPanel以获得焦点,然后当我切换到另一个面板时,我会将主菜单上的transferFocus()调用到新视图。