JOptionPane не будет показывать свой диалог поверх других окон

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

Ответ 1

Создайте пустой фиктивный JFrame, установите его всегда сверху и используйте его как компонент для JOptionPane вместо null. Таким образом, 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();
}

Ответ 2

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

Моя проблема была больше с 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, чтобы немного очистить ваш код.

Ответ 3

Используете ли вы один из консервированных JOptionPanes? (Как JOptionPane.showCOnfirmDialog(...))

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

Ответ 4

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

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

Приходящий на передний вызов в java работает только для java-окон.

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

Ответ 5

Исправьте сообщение выше..

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

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

он отлично работает для меня:)

Ответ 6

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

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

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

SetState покажет окно пользователю, если оно было ранее в мини-состоянии.