使Java Swing模式对话框像Mac OSX对话框一样运行

我正在编写一个小应用程序,它需要一个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 。 即使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); } } 

 int titleBarHeight = frame.getInsets().top; 

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

然后你做错了,因为这不应该发生。

发布certificate问题的SSCCE 。