Mac上的Java:如何检测应用程序何时获得焦点?

6 java macos events focus

我查看了ApplicationListener,但他们没有在那里.在Mac上,当应用程序具有相同的焦点时; 它的菜单位于顶部菜单栏中.

另外,如果您知道这一点,您能否告诉我我的应用程序如何请求解除对焦?

tra*_*god 5

的实现windowActivated(),并windowDeactivated()WindowListenerWindowAdapter会告诉你,当被激活或停用的窗口.你不需要那样做ApplicationListener.

附录:虽然在这种情况下不需要,但ApplicationListener在此示例中可以找到指定的附加功能的透明实现.

附录:另请参见如何编写窗口侦听器.

附录:我想我明白你的意思了.在使用的示例中OSXAdapter,-Dapple.laf.useScreenMenuBar=true当最后一个窗口(HIDE_ON_CLOSE默认情况下)关闭时,菜单会消失.这是不是最佳,但About…Preferences菜单保持在应用程序菜单; 选择还是恢复屏幕菜单.另一种可能性是修改停靠菜单com.apple.eawt.Application.

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.awt.event.WindowListener;
import java.awt.event.WindowStateListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class WindowTest extends JFrame implements ActionListener,
    WindowListener, WindowFocusListener, WindowStateListener {

    public static final void main(String args[]) throws Exception {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new WindowTest("One");
                new WindowTest("Two");
            }
        });
    }

    public WindowTest(String name) {
        super(name);
        this.setName(name);
        this.setLayout(new GridLayout(0, 1));
        createButton("Back");
        createButton("Front");
        createButton("Hide");
        this.addWindowListener(this);
        this.addWindowFocusListener(this);
        this.addWindowStateListener(this);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.pack();
        this.setVisible(true);
    }

    private void createButton(String name) {
        JButton b = new JButton(name);
        this.add(b);
        b.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String s = e.getActionCommand();
        if ("Back".equals(s)) {
            this.toBack();
        } else if ("Front".equals(s)) {
            this.toFront();
        } else {
            this.setExtendedState(JFrame.ICONIFIED);
        }
    }

    @Override
    public void windowOpened(WindowEvent e) {
        System.out.println(e);
    }

    @Override
    public void windowClosing(WindowEvent e) {
        System.out.println(e);
    }

    @Override
    public void windowClosed(WindowEvent e) {
        System.out.println(e);
    }

    @Override
    public void windowIconified(WindowEvent e) {
        System.out.println(e);
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
        System.out.println(e);
    }

    @Override
    public void windowActivated(WindowEvent e) {
        System.out.println(e);
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
        System.out.println(e);
    }

    @Override
    public void windowGainedFocus(WindowEvent e) {
        System.out.println(e);
    }

    @Override
    public void windowLostFocus(WindowEvent e) {
        System.out.println(e);
    }

    @Override
    public void windowStateChanged(WindowEvent e) {
        System.out.println(e);
    }

}
Run Code Online (Sandbox Code Playgroud)