JOptionPane不会在其他窗口的顶部显示其对话框

时间:2009-01-13 09:43:19

标签: java swing joptionpane

我目前在摆动提醒应用程序方面存在问题,该应用程序可以最小化到托盘关闭。我的问题是,我需要按照我设置的方式按时弹出JOptionPane对话框,但问题是,当我最小化它时,对话框会弹出,但不会出现在windows的顶部,当其他应用程序如explorer,firefox正在运行,任何人都知道如何在Windows上弹出对话框,无论正在运行什么应用程序?

6 个答案:

答案 0 :(得分:10)

创建一个空的相应虚拟JFrame,将其始终置于顶部并将其用作JOptionPane的组件而不是null。因此,JOptionPane始终位于应用程序的所有其他窗口的顶部。您还可以使用虚拟JFrame的位置确定JOptionPane在屏幕上的显示位置。

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();
}

答案 1 :(得分:7)

老帖子,但我正在努力解决这个问题。

我的问题更多的是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中调用它来清理你的代码。

答案 2 :(得分:4)

您使用的是其中一个罐装JOptionPanes吗? (如JOptionPane.showCOnfirmDialog(...))

您可能希望查看扩展JDialog并创建自己的对话框面板,然后调用myDialog.setAlwaysOnTop(true);

答案 3 :(得分:3)

自XP以来,Windows正在阻止此操作。

之前的情景如下: 您在编辑器中输入某些文本并且在您倾斜文本时无法识别另一个对话框。即将到来的对话框将成为焦点,您将在新对话框中进行操作。也许您在准备就绪后单击Enter并在错误的对话框中执行此操作,这会询问您是否真的想要删除硬盘;)

java中的前台调用仅适用于java windows。

通知用户新窗口的可能性是实现一个框架,它将在Windows任务栏中突出显示/闪烁。

答案 4 :(得分:3)

更正上面的帖子..

我已解决了以下问题:

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

它适用于我:)

答案 5 :(得分:1)

您可能会考虑使用JFrame。它可以给你一点灵活性。

如果您正在使用JFrame,并且希望它在其他窗口之上弹出,请使用:

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

如果用户之前处于最小化状态,则setState将向用户显示该窗口。