Java на Mac: Как я обнаруживаю, когда мое приложение получает фокус?

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

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

6
задан 22 May 2010 в 19:43
поделиться

3 ответа

Реализации windowActivated () и windowDeactivated () в WindowListener или WindowAdapter сообщат вам когда окно активировано или деактивировано. Для этого вам не нужен ApplicationListener .

Приложение: Хотя это и не требуется в этом случае, прозрачная реализация дополнительных функций, указанных в ApplicationListener , может быть найдена в этом примере .

Приложение: См. Также Как писать оконные слушатели .

Приложение: Думаю, я понимаю, что вы имеете в виду. В примере OSXAdapter , который использует -Dapple.laf.useScreenMenuBar = true , меню исчезают, когда закрывается последнее окно ( HIDE_ON_CLOSE по умолчанию). Это менее чем оптимально, но меню О… и Настройки остаются в меню приложения; выбор либо восстанавливает экранное меню. Другая возможность - изменить док-меню в 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);
    }

}
5
ответ дан 17 December 2019 в 02:25
поделиться

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

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

frame.toBack();

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

frame.setExtendedState(...);
1
ответ дан 17 December 2019 в 02:25
поделиться

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) .
0
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: