为什么这个侦听器不会检测窗口关闭事件?

Max*_*xpm 4 java events swing awt windowlistener

我正在尝试在单个Frame通道上侦听事件WindowStateListener.

import java.awt.Frame;
import java.awt.Label;

import java.awt.event.WindowStateListener;
import java.awt.event.WindowEvent;

public class UserInterface implements WindowStateListener
{
    public static void main(final String[] arguments)
    {
        UserInterface userInterface = new UserInterface();
    }

    public UserInterface()
    {
        Frame frame = new Frame("Graphics Example");
        frame.addWindowStateListener(this);
        frame.add(new Label("Hello, world!");
        frame.pack();
        frame.setVisible(true);
    }

    public void windowStateChanged(WindowEvent event)
    {
        System.out.println(event.paramString();
    }
}
Run Code Online (Sandbox Code Playgroud)

它适用于最小化事件,但不适用于近似事件. WINDOW_CLOSING绝对是一个有效的WindowEvent价值,它肯定是Frame可以抛出的东西.那么为什么不传递给它windowStateChanged()呢?

Jef*_*rey 5

不会向WindowStateListeners通知窗口关闭事件.它们仅被通知窗口状态的更改,例如图标化或取消图标化.如果您想要关闭事件,请实现WindowListener(或扩展WindowAdapter).本教程将其解释为http://download.oracle.com/javase/tutorial/uiswing/events/windowlistener.html.


小智 5

您可以使用它。

frame.addWindowListener(new java.awt.event.WindowAdapter()
{
public void windowClosing(WindowEvent winEv)

}}
Run Code Online (Sandbox Code Playgroud)

这肯定会编译。

class TestSnippet {
    public static void main(Sring[] args) {

        // START: copy/pasted snippet
        frame.addWindowListener(new java.awt.event.WindowAdapter()
        {
        public void windowClosing(WindowEvent winEv)

        }}
        // END: copy/pasted snippet
    }
}
Run Code Online (Sandbox Code Playgroud)

(路人注意)嗯,除了..

I:\proj\TestSnippet.java:7: ';' expected
        public void windowClosing(WindowEvent winEv)
                                                    ^
I:\proj\TestSnippet.java:9: ')' expected
        }}
         ^
2 errors

Tool completed with exit code 1
Run Code Online (Sandbox Code Playgroud)