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

Mac上的Java:如何检测应用程序何时接收焦点?,java,macos,events,focus,Java,Macos,Events,Focus,我仔细看了看,里面没有。在Mac电脑上,当应用程序具有相当于焦点的功能时;其菜单位于顶部菜单栏中 另外,如果您知道这一点,您能告诉我我的应用程序如何请求去聚焦吗?中windowActivated()和windowDeactivated()的实现,或者将告诉您何时激活或停用窗口。你不需要那样做 附录:虽然在这种情况下不需要,但在本文件中可以找到中指定的附加功能的透明实现 增编:另见 附录:我想我明白你的意思了。在使用-Dapple.laf.useScreenMenuBar=true的示例中,当最后

我仔细看了看,里面没有。在Mac电脑上,当应用程序具有相当于焦点的功能时;其菜单位于顶部菜单栏中


另外,如果您知道这一点,您能告诉我我的应用程序如何请求去聚焦吗?

windowActivated()
windowDeactivated()
的实现,或者将告诉您何时激活或停用窗口。你不需要那样做

附录:虽然在这种情况下不需要,但在本文件中可以找到中指定的附加功能的透明实现

增编:另见

附录:我想我明白你的意思了。在使用
-Dapple.laf.useScreenMenuBar=true
的示例中,当最后一个窗口(
HIDE\u ON\u CLOSE默认情况下
关闭)关闭时,菜单消失。虽然不是最理想的,但是
关于…
首选项
菜单仍保留在应用程序菜单中;选择其中一个可恢复屏幕菜单。另一种可能是修改
com.apple.eawt.Application
中的dock菜单

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);
    }

}
你能告诉我我的申请怎么样吗 你可以请求去聚焦吗

您可以尝试:

frame.toBack();
如果这不起作用,那么您可以将应用程序图标化,在这种情况下,焦点应该转到上一个应用程序

frame.setExtendedState(...);

Java编程语言是独立于平台的。与其阅读苹果的参考文档,不如使用官方文档。在那里您可以找到和的文档。您可以使用函数在JFrame上注册WindowListener。窗口侦听器可用于截获和处理各种与窗口相关的事件,包括激活/取消激活(哪个窗口在顶部)或获得焦点/失去焦点(哪个窗口将接收键盘事件)。如果您正在提供自己的WindowListener,并且不想实现每个函数,那么WindowAdapter在这方面很有用,因为它实现了WindowListener,但为每个函数提供了空定义。至于离焦(在你的意思上),可以用它,反之亦然

编辑
这些信息大部分已经在以前的帖子中给出;然而,我补充这一点是为了强调:

  • Java是一种独立于平台的语言
  • Java是Sun Microsystems(现在的Oracle)的产品
  • 因此,使用Sun官方API比依赖苹果提供的任何参考文档更有意义,因为官方API参考文档中包含的任何内容都可以在所有平台上运行;然而,苹果参考文档中的任何内容都很可能是针对苹果实施的
  • 来自官方权威参考文档的参考文档提供了回答问题所需的所有信息(因此,还有另一个原因需要参考官方API参考文档,而不是依赖苹果的文档)

-1,WindowListener是在6小时前提出的。toBack()是5小时前提出的。我认为没有理由重复这些建议。此外,
ApplicationListener
旨在补充而不是取代核心UI。请参阅
README.txt
,了解我在回答中引用的
OSXAdapter
示例。@camickr,我想强调官方参考文档的使用(请参阅我的编辑)。此外,其他人没有指出Java术语中的“焦点”意味着键盘焦点(不是哪个窗口在顶部),我的回答也给出了这个答案。问题是,我使用
frame.setVisible(false)
隐藏了我的窗口,它隐藏了窗口,但不像Mac的“隐藏”选项那样工作。它隐藏帧,但应用程序保留焦点。使用
frame.toBack()
也不起作用;应用程序保留了焦点,只是窗口移到了后面。在mac上,当您隐藏应用程序时,应用程序将隐藏其所有窗口和散焦,并在您给予应用程序焦点时取消隐藏所有窗口和散焦。但是,使用
frame.setVisible()
,即使您对应用程序进行散焦并使其恢复焦点,它也不会重新出现。(续)它们是完全不同的方法,
setVisible()
和Mac的隐藏函数。问题是,我已经使用了WindowListener,但是当我给它焦点时,窗口不会重新出现,所以它不工作。你看到我的大问题了吗?我试过这些。你还有其他建议吗?我知道你可能没有使用Mac电脑的经验,但你过去帮了我很大的忙。@Stuart:
toBack()
没有承诺专注。另外,切换应用程序是用户的权限。上面的示例显示了两个窗口的
Window
事件,但您也可以浏览教程。我已经使用了OSXAAdapter,但它还不够。除其他外,我根本无法管理或检测应用程序焦点。我希望我能找到一个方法来做这件事…我很困惑
OSXAAdapter
似乎与此问题无关,示例中没有使用它。当我在应用程序之间或示例窗口之间使用alt-tab键或alt-tab键时,我在最前面的窗口上看到WINDOW\u失去焦点和WINDOW\u获得焦点事件。