【问题标题】:Make Java Swing Modal Dialog Behave Like Mac OSX Dialogs使 Java Swing 模态对话框的行为类似于 Mac OSX 对话框
【发布时间】:2012-01-30 00:22:03
【问题描述】:

我正在编写一个小型应用程序,它需要 ProgressBar 显示在框架的 TitleBar 下方,这在 Mac OSX 应用程序中很常见。我有两个问题:

1。我已经管理了定位,但我不得不硬编码父 Frame 的 TitleBar 高度。有没有一种“软”方法来获取 TitleBar 的高度?

在Dialog的构造函数中:

 Dimension dimensionParentFrame = parent.getSize();
 Dimension dimensionDialog = getSize();
 int x = parent.getX() + ((dimensionParentFrame.width - dimensionDialog.width)/2);
 setLocation(x, parent.getY() + 22);              // TODO HARD CODE WARNING TITLE HEIGHT

2。即使对话框是模态的,我仍然可以单击父框架并移动它。如何使对话框“粘”到父框架?也就是说,当父 Frame 移动时,Dialog 会随之移动,就好像附加了一样。

任何帮助/指针将不胜感激。

代码如下:



    import javax.swing.JFrame;
    import javax.swing.JButton;
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;


    public class ModalDialogDemoFrame extends JFrame
    {
      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);
      }

      /**
       * @param args
       */
      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();
            }
          }
        });
      }

    }

    import java.awt.Dimension;

    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JButton;
    import java.awt.BorderLayout;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;


    public class ModalDialog extends JDialog
    {
      public ModalDialog(JFrame parent, boolean modal) 
      {
        super(parent, 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);
        setModalityType(ModalityType.APPLICATION_MODAL);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        JButton buttonClose = new JButton("Close");
        buttonClose.addActionListener(new ActionListener() 
        {
          public void actionPerformed(ActionEvent e) 
          {
            dispose();
          }
        });
        getContentPane().add(buttonClose, BorderLayout.CENTER);
      }

    }

【问题讨论】:

  • “即使对话框是模态的,我仍然可以点击父框架” 框架是对话框的父框架吗?
  • 是的安德鲁,框架是对话框的父级。

标签: java macos swing modal-dialog jdialog


【解决方案1】:
int titleBarHeight = frame.getInsets().top;

即使对话框是模态的,我仍然可以单击父框架并移动它。

那么你做错了什么,因为这不应该发生。

发布您的SSCCE 来证明问题。

【讨论】:

  • frame.getInsets().top;是正确的,它得到了 TitleBar 的高度。谢谢。
  • 这里是具有两个类的 SSCCE,一个父 JFrame 和一个 JDialog。运行,点击“打开对话框”按钮加载对话框。然后点击 JFrame 的 TitleBar 并移动它。
  • 请注意,我在 OSX 10.6 的 iMac 上运行此程序,我不知道这是否会有所不同。
  • 我开始认为 OSX 上的模态 JDialog 不会阻止它的所有者 JFrame 被移动。诚然,您无法对所有者 JFrame 做任何事情,但感觉不对。
  • 我看到 Quaqua 已经完成了我的要求,但是使用 ComponentAdapter 需要大量代码才能达到预期的结果......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多