Можно ли перенести JFrame на передний план, но не сосредоточиться?

Я пишу Java-приложение (Swing GUI), которое периодически выдает JFrame.

Возможно ли каким-либо образом принести окно вперед (foo.setAlwaysOnTop(true) будет еще лучше), но без сфокусирован?

Некоторые люди время от времени отводят глаза от экрана, чтобы посмотреть на их клавиатуру во время набора текста, и я уверен, что если бы это окно всегда захватывало фокус клавиатуры, люди были бы очень раздражены, поскольку это заставляло их терять довольно много нажатий клавиш каждый раз, когда оно всплывает незамеченным.

В других случаях, даже когда пользователь на самом деле способен печатать, не глядя на клавиатуру все время, всплывающее окно и фокус может вызвать нежелательные действия из самого всплывающего окна (некоторые Tab + Enter, например, когда пользователь случайно выбирает вариант, который она действительно не выбрала бы в противном случае).

Спасибо заранее!

Обновление

Как говорит Джонас, foo.setFocusableWindowState(false);, похоже, работает, если вызвано после визуализации окна (проверено только на Gnome).

Это не работает:

foo.setFocusableWindowState(false);
foo.setVisible(true);
foo.setFocusableWindowState(true);

Однако этот делает:

foo.setFocusableWindowState(false);
foo.setVisible(true);
Thread.sleep(1000);
foo.setFocusableWindowState(true);

Мне нужно посмотреть, есть ли событие, которое я могу поймать/прослушать, что позволяет мне делать foo.setFocusableWindowStatue(true);, когда это необходимо.

Я считаю, что моя проблема решена.: -)

Ответ 1

Это может работать:

foo.setFocusableWindowState(false);

Ответ 2

Начиная с Java 1.7 вы можете позвонить

frame.setAutoRequestFocus(false);

Ответ 3

Недавно я столкнулся с той же проблемой, и предварительное решение было:

JFrame frame = ...;
frame.setExtendedState(JFrame.NORMAL);
frame.setAlwaysOnTop(true);
frame.requestFocus();
frame.setAlwaysOnTop(false);

Ответ 4

Предложение: в компоненте GUI, который создает кадр, введите два последовательных вызова:

frameJustCreated.requestFocus();
this.requestFocus();

Первый выводит окно нового JFrame в начало, второе - окно, в котором пользователь вводит верх.

Ответ 5

Если вы хотите вызвать setFocusableWindowState (true) в событии (поэтому, чтобы не ждать, например, 1 секунду), вы можете добавить WindowListener (например, полученный из WindowAdapter), который изменяет свойство:

    appFrame.addWindowListener(new WindowAdapter() {
        @Override
        public void windowOpened(WindowEvent e) {
            super.windowOpened(e);
            e.getWindow().setFocusableWindowState(true);
        }
    });

    appFrame.setFocusableWindowState(false);
    appFrame.setVisible(true);