Java JDialog взаимодействие без акцента на macOS - PullRequest
0 голосов
/ 29 мая 2018

я знаю, что вокруг этого вопроса много дискуссий, но это не так.У нас есть Java-приложение, которое показывает JDialog для события Keyboard в Windows (Native hook).Это работает нормально, когда я щелкаю что-то в окне Java, фокус текущего приложения не теряется.В macOS это меняет активное приложение на мое окно Java.Мне удалось скрыть значок док-станции с этим:

-Dglass.taskbarApplication=false

Но этого недостаточно, я хочу, чтобы мое java-приложение никогда не фокусировалось.Я прочитал о безголовом свойстве, и оно не может работать, так как я показываю JDialog.Он отлично работает в Windows, но на Mac, я думаю, что приложение в трее не то же самое.Это возможно?Это проблема с JDialog, или я могу добавить аргумент для запуска моего приложения Java в фоновом режиме?Спасибо

1 Ответ

0 голосов
/ 05 июня 2018

Примечание: Решение, приведенное ниже, протестировано только на OS X

Вынуждает JDialog иметь тип Window.Type#POPUP, как показано ниже.work.

dialog.setType(Window.Type.POPUP);

Это позволяет диалогу быть фокусируемым, и когда он получает фокус, другие окна не теряют фокус, как всплывающее меню.Тем не менее, он также имеет другие эффекты, такие как заставить диалог вести себя так, как если бы был вызван dialog.setAlwaysOnTop(true).

Примечание: Пример приложения ниже при запуске не фокусирует другие окна при запуске, но не после не сфокусированных оконснова сфокусированы.

Пример:

import java.awt.EventQueue;
import java.awt.Window;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class NonUnfocusingDialogExample {

    public static void main(final String[] args) {
        EventQueue.invokeLater(() -> {
            final JDialog dialog = new JDialog();
            dialog.setType(Window.Type.POPUP);
            dialog.getContentPane().add(new JLabel("Hello World!", 
                    SwingConstants.CENTER));
            dialog.pack();
            dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            dialog.setTitle("Test Dialog");
            dialog.setLocationByPlatform(true);
            dialog.setVisible(true);
        });
    }

}
...