2016-04-26 61 views
2

我创建了一个从WindowAdapter扩展的类,这样每次我想关闭一个窗口时,它会问你是否真的要关闭窗口。当我点击“否”时出现问题。我该如何处理它,以便窗口事件不会“保持”在那里,并且框架一直在尝试分派它? 我只做一个回报,我不能拿出任何东西。下面的代码:WindowAdapter发送一个窗口事件(关闭窗口)

public class ExitController extends WindowAdapter{ 

    @Override 
    public void windowClosing(WindowEvent windowEvent) { 
     if(JOptionPane.showConfirmDialog(null,"Are you sure to close this window?", 
     "Really Closing?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) 
     == JOptionPane.YES_OPTION){ 
        System.exit(0); 
       } else { 
        return; 
       } 
      } 
     } 
+0

你在这里做什么应该工作。其他听众也会收到该事件。 –

回答

1

的问题是在JFrame.processWindowEvent

protected void processWindowEvent(WindowEvent e) { 
    super.processWindowEvent(e); // --> this will call your listener 

    if (e.getID() == WindowEvent.WINDOW_CLOSING) { 
     switch(defaultCloseOperation) { 
      case HIDE_ON_CLOSE: 
      setVisible(false); 
      break; 
      case DISPOSE_ON_CLOSE: 
      dispose(); 
      break; 
      case DO_NOTHING_ON_CLOSE: 
      default: 
      break; 
      case EXIT_ON_CLOSE: 
       // This needs to match the checkExit call in 
       // setDefaultCloseOperation 
      System.exit(0); 
      break; 
     } 
    } 
} 

独立的监听器做什么时,JFrame评估其defaultCloseOperation并关闭或隐藏自身。

因此,您需要也初始化架在其上安装监听器,以防止默认操作权默认关闭操作:

frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
frame.addWindowListener(new ExitController()); 

你可以在ExitListener提供一种方法,以促进这一点:

public class ExitController extends WindowAdapter { 
    public void installOn(JFrame frame) { 
     frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
     frame.addWindowListener(this); 
    } 
+0

我已经做到了。问题的确在于,当我与界面交互并且面板发生变化时,返回调用会遍历所有这些并继续显示确认对话框(新的弹出窗口),以尝试分派相同的(窗口)事件。有什么方法可以使用它或什么? – jari

+0

@Jari你应该添加一个小例子程序到你的问题,它演示的效果... – wero

+0

它似乎并没有工作......它说“方法消耗()从类型AWTEvent不可见”。 – jari

2

结帐Closing an Application

它给出了一些基本的代码。基本代码会将帧的默认关闭操作设置为DO_NOTHING_ON_CLOSE

然后在WindowListener中,当用户确认关闭时,它会将默认关闭操作重置为EXIT_ON_CLOSE而不是使用System.exit(0);

您还可以使用CloseListener类,它是您的ExitController类的更复杂的版本(因为它提供更多的功能)。