JOptionPane не будет показывать свой диалог поверх других окон - PullRequest
11 голосов
/ 13 января 2009

В настоящее время у меня проблема с приложением для напоминания о свинге, которое позволяет свернуть лоток при закрытии. Моя проблема здесь в том, что мне нужно, чтобы диалоговое окно JOptionPane появлялось вовремя в соответствии с тем, что я установил, но проблема здесь в том, что, когда я его минимизирую, диалоговое окно появляется, но не в верхней части окна, когда другое приложение, такое как explorer, firefox кто-нибудь знает, как открыть диалоговое окно поверх окон независимо от того, какое приложение запущено?

Ответы [ 6 ]

10 голосов
/ 25 марта 2013

Создайте пустой фиктивный JFrame, установите его всегда сверху и используйте его как компонент для JOptionPane вместо нуля. Таким образом, JOptionPane всегда остается над всеми остальными окнами приложения. Вы также можете определить, где JOptionPane появляется на экране вместе с расположением фиктивного JFrame.

JFrame frmOpt;  //dummy JFrame

private void question() {
    if (frmOpt == null) {
        frmOpt = new JFrame();
    }
    frmOpt.setVisible(true);
    frmOpt.setLocation(100, 100);
    frmOpt.setAlwaysOnTop(true);
    String[] options = {"delete", "hide", "break"};
    int response = JOptionPane.showOptionDialog(frmOpt, msg, title, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, "delete");
    if (response == JOptionPane.YES_OPTION) {
        removeRow();
    }
    frmOpt.dispose();
}
7 голосов
/ 16 апреля 2015

Старый пост, но я боролся с этим.

Моя проблема была больше с Javafx, позволяющим JOptionPane идти за текущим окном Java.

Поэтому я использовал следующее, что делает то, о чем просил оригинальный плакат, помещая JOptionPane перед всеми окнами; даже JAVAFX.

Во-первых, старая JOptionPane:

JOptionPane.showMessageDialog(null, "Here I am");

Теперь JOptionPane, которая остается впереди:

final JDialog dialog = new JDialog();
dialog.setAlwaysOnTop(true);    
JOptionPane.showMessageDialog(dialog, "Here I am");

А для забавы все в одной длинной строке:

JOptionPane.showMessageDialog(
                 ((Supplier<JDialog>) () -> {final JDialog dialog = new JDialog(); dialog.setAlwaysOnTop(true); return dialog;}).get()
                 , "Here I am");

Вы можете создать статический метод, который будет возвращать JDialog для вас, а затем просто вызвать его в JOptionPane, чтобы немного очистить ваш код.

4 голосов
/ 14 января 2009

Вы используете одну из консервированных панелей JOptionPanes? (Например, JOptionPane.showCOnfirmDialog (...))

Возможно, вы захотите посмотреть на расширение JDialog и создание собственной диалоговой панели, а затем вызвать myDialog.setAlwaysOnTop (true);

3 голосов
/ 15 января 2009

Исправление поста выше ..

Я решил мою проблему, как показано ниже:

this.setVisible(true); // show main frame
MyDialog dialog = New MyDialog(this, true); // show my custom dialog
dialog.setVisible(true);
this.setVisible(false);

у меня работает нормально :) 1006 *

3 голосов
/ 13 января 2009

Windows блокирует эту операцию начиная с XP.

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

Вызов на вызов в Java работает только для окон Java.

Возможность уведомить пользователя о новом окне заключается в реализации фрейма, который будет подсвечиваться / мигать на панели задач Windows.

1 голос
/ 14 января 2009

Вместо этого вы можете подумать об использовании JFrame. Это может дать вам немного больше гибкости.

Если вы используете JFrame и хотите, чтобы он всплывал поверх других окон, используйте:

myFrame.setVisible(true);
myFrame.setState(Frame.NORMAL);

setState покажет окно пользователю, если оно ранее было свернуто.

...