【问题标题】:how to show JOptionPane on the top of all windows如何在所有窗口的顶部显示 JOptionPane
【发布时间】:2012-06-08 12:10:11
【问题描述】:

我创建了一个 DialogUtil,它显示不同情况下 JOptionPan 的数量。 有时在我的动作类中使用如下的空参数调用此方法。

DialogUtil.showNotExist(null,xml.getName().concat(" is null or"));

在这种情况下,JOptionPane 不会出现在窗口顶部。

如何向 JOptionPane 添加内容以始终显示在顶部?

public static void showNotExist(JPanel panel, String action) {
    JOptionPane.showMessageDialog(panel, new JLabel(action.concat(" doesn't exist."), 2));
}

【问题讨论】:

  • 只需将 parent 作为参数传递,而不是 JPanel ,让它成为主要容器,即 JFrame,那么您真的不必为这些事情烦恼:-)跨度>
  • “有时在我的操作类中使用如下的空参数调用此方法。” 为什么null
  • 因为我在没有引用 GUI 或框架的类的主体中调用此方法。

标签: java windows swing joptionpane


【解决方案1】:

您可以使用以下代码将 JOptionPane 设置在最前面:-

JFrame jf=new JFrame();
jf.setAlwaysOnTop(true);
int response = JOptionPane.showConfirmDialog(jf,"Message", "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

【讨论】:

    【解决方案2】:

    如果你的类扩展了 JFrame,那么只需简单地设置 类属性 setAlwaysOnTop(true);在 JOptionPane.showMessageDialog(null,"OKay"); 之前的构造函数中的任何位置;

    我用它来复制文件和检查,甚至不需要 JFrame 而需要 JOptionPane。

    附:如果您不希望主 JFrame 始终显示在顶部,则需要创建虚拟 JFrame 或重置属性 setAlwaysOnTop(false);在 JOptionPane 之后。

    【讨论】:

      【解决方案3】:
      public static void showNotExist(JPanel panel, String action) {
          JOptionPane.showMessageDialog(rootPane, new JLabel(action.concat(" doesn't exist."), 2));
      }
      

      尝试将根窗格作为 showMessageDialog 部分中的第一个值

      【讨论】:

        【解决方案4】:

        你尝试过这样的事情吗?

        JOptionPane optionPane = new JOptionPane();
        JDialog dialog = optionPane.createDialog("Title");
        dialog.setAlwaysOnTop(alwaysOnTop);
        dialog.setVisible(true);
        

        不能保证操作系统会允许您的对话框始终位于顶部,但它通常会起作用。

        如果您有一个现有的窗口或对话框,并且您想将其置于顶部,但又不想永久设置 alwaysOnTop,那么这应该可以同时保留 alwaysOnTop 的旧值:

        boolean supported = window.isAlwaysOnTopSupported();
        boolean old_alwaysOnTop = window.isAlwaysOnTop();
        if (supported) {
          window.setAlwaysOnTop(true);
        }
        window.toFront();
        window.requestFocus();
        if (supported) {
          window.setAlwaysOnTop(old_alwaysOnTop);
        }
        

        仅在 SwingThread 上运行该代码。

        【讨论】:

          【解决方案5】:

          有两个可能的问题

          • 从 EDT 调用 JOptionPane,然后屏幕上只显示工具栏(来自 Native OS 的标题,不显示 RootPane)

          • 在那里你可以测试 JOptionPanes 功能,其中 JOptionPane.showInternalMessageDialog() 在所有情况下都会造成麻烦,即存在另一个带有 setModal(true) 的 JDialog,真正的原因我不知道,ModalityTypes 应该也是如此

          • 不能同时在屏幕上显示两个 JOptionPanes

          代码

          import java.awt.event.MouseEvent;
          import javax.swing.JFrame;
          import javax.swing.JButton;
          import java.awt.BorderLayout;
          import java.awt.Dimension;
          import java.awt.EventQueue;
          import java.awt.Toolkit;
          import java.awt.event.ActionListener;
          import java.awt.event.ActionEvent;
          import java.awt.event.MouseAdapter;
          import javax.swing.JDialog;
          import javax.swing.JOptionPane;
          import javax.swing.JRootPane;
          import javax.swing.Timer;
          //http://stackoverflow.com/questions/8670297/make-java-swing-modal-dialog-behave-like-mac-osx-dialogs
          public class ModalDialogDemoFrame extends JFrame {
          
              private static final long serialVersionUID = 1L;
              private ModalDialogDemoFrame modalDialogDemo;
          
              public ModalDialogDemoFrame() {
                  modalDialogDemo = this;
                  setBounds(100, 100, 400, 400);
                  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  JButton buttonDialog = new JButton("Open Dialog");
                  buttonDialog.addActionListener(new ActionListener() {
          
                      public void actionPerformed(ActionEvent arg0) {
                          // Create a Modal Dialog with this Frame as Parent.
                          ModalDialog modalDialog = new ModalDialog(modalDialogDemo, true);
                          modalDialog.setVisible(true);
                      }
                  });
                  getContentPane().add(buttonDialog, BorderLayout.CENTER);
              }
          
              public static void main(String[] args) {
                  EventQueue.invokeLater(new Runnable() {
          
                      public void run() {
                          try {
                              ModalDialogDemoFrame window = new ModalDialogDemoFrame();
                              window.setVisible(true);
                          } catch (Exception e) {
                              e.printStackTrace();
                          }
                      }
                  });
              }
          }
          //http://stackoverflow.com/questions/4577424/distinguish-between-a-single-click-and-a-double-click-in-java/4577475#4577475
          class ClickListener extends MouseAdapter implements ActionListener {
          
              private final static int clickInterval = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
              private MouseEvent lastEvent;
              private Timer timer;
          
              public ClickListener() {
                  this(clickInterval);
              }
          
              public ClickListener(int delay) {
                  timer = new Timer(delay, this);
              }
          
              @Override
              public void mouseClicked(MouseEvent e) {
                  if (e.getClickCount() > 2) {
                      return;
                  }
                  lastEvent = e;
                  if (timer.isRunning()) {
                      timer.stop();
                      doubleClick(lastEvent);
                  } else {
                      timer.restart();
                  }
              }
          
              @Override
              public void actionPerformed(ActionEvent e) {
                  timer.stop();
                  singleClick(lastEvent);
              }
          
              public void singleClick(MouseEvent e) {
              }
          
              public void doubleClick(MouseEvent e) {
              }
          }
          
          class ModalDialog extends JDialog {
          
              private static final long serialVersionUID = 1L;
          
              public ModalDialog(JFrame parent, boolean modal) {
                  Dimension dimensionParentFrame = parent.getSize();
                  setSize(new Dimension((parent == null) ? 300 : dimensionParentFrame.width / 2, 75));
                  Dimension dimensionDialog = getSize();
                  int x = parent.getX() + ((dimensionParentFrame.width - dimensionDialog.width) / 2);
                  setLocation(x, parent.getY() + parent.getInsets().top);
                  //setUndecorated(true);
                  setModal(modal);
                  //setUndecorated(true);
                  //getRootPane().setWindowDecorationStyle(JRootPane.ERROR_DIALOG);
                  setModalityType(ModalityType.APPLICATION_MODAL);
                  setDefaultCloseOperation(DISPOSE_ON_CLOSE);
                  final JButton buttonClose = new JButton("Close");
                  buttonClose.addActionListener(new ActionListener() {
          
                      public void actionPerformed(ActionEvent e) {
          //ok
                          /*JOptionPane.showMessageDialog(buttonClose,
                          "Eggs are not supposed to be green.",
                          "Inane warning",
                          JOptionPane.WARNING_MESSAGE);*/
          //uncomment for un_handled GUI, JOptionPane is behing JFrame I think....
                          /*JOptionPane.showInternalMessageDialog(buttonClose,
                          "Eggs are not supposed to be green.",
                          "Inane warning",
                          JOptionPane.WARNING_MESSAGE);*/
          //ok
                          /*JOptionPane.showConfirmDialog(buttonClose,
                          "Eggs are not supposed to be green.",
                          "Inane warning",
                          JOptionPane.WARNING_MESSAGE);*/
          //ok                
                          /*JOptionPane.showMessageDialog(null,
                          "Eggs are not supposed to be green.",
                          "Inane warning",
                          JOptionPane.WARNING_MESSAGE);*/
          //uncomment for un_handled GUI
          //Exception occurred during event dispatching:
          //java.lang.RuntimeException: JOptionPane: parentComponent does not have a valid parent                
                          /*JOptionPane.showInternalMessageDialog(null,
                          "Eggs are not supposed to be green.",
                          "Inane warning",
                          JOptionPane.WARNING_MESSAGE);*/
          //ok                
                          JOptionPane.showConfirmDialog(null,
                                  "Eggs are not supposed to be green.",
                                  "Inane warning",
                                  JOptionPane.WARNING_MESSAGE);
                          dispose();
                      }
                  });
                  add(buttonClose, BorderLayout.CENTER); // comment for listening
                  addMouseListener(new ClickListener() {
          
                      @Override
                      public void singleClick(MouseEvent e) {
                          System.out.println("single");
                      }
          
                      @Override
                      public void doubleClick(MouseEvent e) {
                          System.out.println("double");
                      }
                  });
              }
          }
          

          【讨论】:

            【解决方案6】:

            我不知道WebOptionPaneWebPanel 是什么,但如果它们基于JOptionPane,那么问题是您将null 的第一个参数传递给showXXX()方法。如果您希望JOptionPane 是模态的——强制它位于指定窗口的前面——那么您需要为第一个参数指定一个窗口(即JFrame)。

            【讨论】:

            • 你是对的,我知道这一点,但我想排在首位,第一个参数是什么,没有指定窗口?
            • 你很有趣。谢谢你的独角兽,我的意思是我想让 JOPtionPan 放在窗户的顶部。
            • @itro,我的意思是你可以想要一些不现实的东西。您必须指定一个框架;如果它必须是最前面的框架,那么你必须弄清楚那是哪一个。有一个静态方法Frame.getFrames() 列出了所有现有的Frame 对象,还有一个方法Window.getFocusOwner() 可以用来确定Frame 是否是最前面的。你的实用方法需要找到正确的Frame并使用它。
            猜你喜欢
            • 2014-06-24
            • 2017-09-25
            • 2010-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多