Я просмотрел ApplicationListener, и у них нет его там. На Mac это - когда то приложение имеет эквивалент фокуса; его меню находится в верхней панели меню.
Кроме того, если Вы знаете это, Вы могли бы сказать мне, как мое приложение может запросить дефокусировать себя?
Реализации 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);
}
}
не могли бы вы рассказать мне, как мое приложение может запросить снятие фокуса с себя?
Вы можете попробовать:
frame.toBack();
Если это не сработает, вы можете сделать свое приложение иконкой, и в этом случае фокус должен перейти к предыдущему приложению.
frame.setExtendedState(...);
Java язык программирования не зависит от платформы. Вместо того, чтобы читать справочную документацию Apple, вам следует использовать официальную Справочную документацию по Java API . Там вы найдете документацию для JFrame , WindowListener и WindowAdapter . Вы можете зарегистрировать WindowListener в JFrame с помощью функции addWindowListener . Слушатель окна может использоваться для перехвата и обработки различных событий, связанных с окном, включая активировано / деактивировано (какое окно находится наверху) или получен / потерян фокус (какое окно будет получать события клавиатуры).Если вы предоставляете свой собственный WindowListener и не хотите реализовывать каждую отдельную функцию, WindowAdapter полезен для этой цели, поскольку он реализует WindowListener, но предоставляет пустые определения для каждой функции. Что касается расфокусировки (в том смысле, в котором вы имеете в виду), для этого можно использовать toBack , тогда как toFront делает обратное.
Править
Большая часть этой информации уже была предоставлена в предыдущих сообщениях; однако я добавил следующее, чтобы подчеркнуть: