Java на Mac: как определить, когда мое приложение получает фокус? - PullRequest
6 голосов
/ 22 мая 2010

Я просмотрел ApplicationListener , и у них его там нет.На Mac это когда приложение имеет эквивалент фокуса;его меню находится в верхней строке меню.

Кроме того, если вы знаете это, не могли бы вы сказать мне, как мое приложение может запросить отмену фокусировки?

Ответы [ 3 ]

5 голосов
/ 23 мая 2010

Реализации windowActivated() и windowDeactivated() в WindowListener или WindowAdapter сообщат вам, когда окно активировано или деактивировано. Для этого вам не нужно 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);
    }

}
1 голос
/ 23 мая 2010

Не могли бы вы рассказать мне, как мое приложение можете запросить расфокусировку себя?

Вы можете попробовать:

frame.toBack();

Если это не сработает, вы можете обозначить свое приложение, в этом случае фокус должен перейти к предыдущему приложению.

frame.setExtendedState(...);
0 голосов
/ 23 мая 2010

Язык программирования Java не зависит от платформы. Вместо того, чтобы читать справочную документацию Apple, вы должны использовать официальную Справочную документацию по Java API . Там вы найдете документацию для JFrame , WindowListener и WindowAdapter . Вы можете зарегистрировать WindowListener на JFrame, используя функцию addWindowListener . Слушатель окна может использоваться для перехвата и обработки множества связанных с окном событий, включая активированный / деактивированный (какое окно находится сверху) или полученный фокус / потерянный фокус (какое окно будет принимать события клавиатуры). Если вы предоставляете свой собственный WindowListener и не хотите реализовывать каждую функцию, WindowAdapter полезен для этой цели, так как он реализует WindowListener, но предоставляет пустые определения для каждой функции. Что касается расфокусировки (в том смысле, что вы имеете в виду), для этого можно использовать toBack , тогда как toFront делает противоположное.

Редактировать
Большая часть этой информации уже была дана в предыдущих постах; Однако я добавил это, чтобы подчеркнуть:

  • Java - независимый от платформы язык.
  • Java является продуктом Sun Microsystems (сейчас Oracle).
  • Следовательно, использование официальной справочной документации по API Java от Sun имеет гораздо больший смысл, чем полагаться на любую справочную документацию, предоставленную Apple, поскольку все, что содержится в официальной справочной документации по API, будет работать на всех платформах; тогда как что-либо из справочной документации Apple вполне может быть специфичным для реализации Apple.
  • Справочная документация для JFrame из официальной, авторитетной справочной документации дает всю информацию, необходимую для ответа на вопрос (отсюда еще одна причина, чтобы обратиться к официальной справочной документации API, а не полагаться на документацию Apple) .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...