【问题标题】:Enable event windowActivated (JFrame) from JPanel从 JPanel 启用事件 windowActivated (JFrame)
【发布时间】:2017-03-30 19:21:15
【问题描述】:

我有这个问题:我正在构建一个游戏。我正在尝试检查missionA是否完成,传递给MissionB。

我有一个 StageClass(扩展 JFrame),这个:

public class Stage extends JFrame {
  Scene missionOne;
public Stage(){
  //Code
  missionOne=new Scene();
  add(missionOne);
  addWindowListener(new java.awt.event.WindowAdapter(){         
        public void windowActivated(java.awt.event.WindowEvent evt){
            checkMissionState();
        }
    });
}

private void checkMissionState(){
        if(missionOne.complete()){          
            //ChangeMission
        }
    }
}

在场景类中:

public class Scene extends JPanel implements ActionListener,KeyListener {
   //Allcode
   public boolean complete(){
     boolean sw=false;
     //Verify a list of conditions
     return sw;
   }

任务完成后,我没有执行 checkMissionState()。原因是这一刻的焦点是场景。我试过windowLostFocus,windowDeactivated,也没有执行。

我可以得到一个解决方案,在屏幕上从 complete() 发送 JOptionPane 消息

public class Scene extends JPanel implements ActionListener,KeyListener {
  //Allcode

   public boolean complete(){
     boolean sw=false;
     //Verify a list of conditions 
    if(sw) JOptionPane.showMessageDialog(null,"Mission is complete");
      return sw;
}

有效。但这退出了游戏中的 Jugability。

我正在 JFrame 中搜索一种执行 checkMissionState() 的形式,而不发送 JOptionPane 消息。

怎么可能?

【问题讨论】:

  • 为什么激活一个窗口会改变游戏的状态?如果任务在窗口失去焦点之前完成,那么如果窗口重新获得焦点,它仍然会完成。所以你的游戏逻辑需要检查任务何时完成,而不是 WindowListener。
  • 当我添加场景任务One focus Lost 我正在尝试使用 windowActivated 因为有十 (10) 个任务,必须从 JFrame 添加或删除的 SceneClass 的十个对象

标签: java events jframe jpanel windowlistener


【解决方案1】:

在您的 Scene 类中,您可以实现 FocusListener 接口并覆盖以下方法。

@Override
public void focusGained(FocusEvent fe){
    System.out.println("Focus gained in JPanel");
}

@Override
public void focusLost(FocusEvent fe){
    System.out.println("Focus lost in JPanel");
}

在您的 Scene 类构造函数中添加以下语句。

addFocusListener(this);

不知道您在失去或获得焦点时执行了什么操作,您可以针对 focusLost 和 focusGained 事件执行适当的游戏操作。

【讨论】:

  • 我会从 JFrame 中删除 JPanel 并在 JFrame 中添加一个新的 JPanel。我可以通过 JPanel 做到这一点吗? ...
  • 不确定您的意思 面板已出。但是您可以动态地将 JPanel 添加到容器中。添加每个面板后,不要忘记 revalidate() 父面板。
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
相关资源
最近更新 更多