Можно ли довести JFRAME на фронт, но не фокусироваться?

StackOverflow https://stackoverflow.com/questions/4788953

Вопрос

Я пишу приложение Java (Gui 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); Когда уместно.

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

Это было полезно?

Решение

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

foo.setFocusableWindowState(false);

Другие советы

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

frame.setAutoRequestFocus(false);

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

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

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

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

1 -й принесите окно нового jframe в верхнюю часть, 2 -й оставляет окно, где пользователь печатает вверху.

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

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

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

JinternalFrame toFront() вызовы в moveToFront()

Переопределить moveToFront()

public void moveToFront() {
        Window window = SwingUtilities.getWindowAncestor(this);
        Component focusOwner = (window != null) ? window.getFocusOwner() :
                                null;
        boolean descendant = false;

        if (window != null && focusOwner != null &&
                      SwingUtilities.isDescendingFrom(focusOwner, this)) {
            descendant = true;
            requestFocus();
        }

        super.moveToFront();

        if (descendant) {
            focusOwner.requestFocus();
        }
    }

Исправление находится в MovetoFront, чтобы проверить, сосредоточен ли у ребенка, если оно есть, а затем временно запросить фокус на внутреннем кадре. После того, как внутренняя кадра имеет перемещение на спереди, затем запросить фокус на ранее сфокусированный компонент. Это обеспечит создание соответствующих событий.

ссылатьсяhttps://bugs.openjdk.java.net/browse/jdk-4309079

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top