设置JDialog相对于JFrame的位置

有没有办法设置相对于JFrame的对话框位置?

我想将对话框置于包含GUI的框架中,而对话框通常出现在屏幕的中心而不是GUI中。

有没有办法相对于另一个JFrame设置位置

您可以:

  • 传递JFrame作为JDialog.setLocationRelativeTo的参数(组件c)
  • 设置为从JFrame到JDialog.setLocation(Point p)的所需Point

编辑

所有Swing代码都必须在EventDispatchThread上完成,这意味着应将setVisible(true)包装到invokeLater

EDIT2

当使用JFrame作为组件c我得到一个找不到符号错误

不可能,一些小错误

在此处输入图像描述

 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.EmptyBorder; public class ClosingFrameDialog extends JFrame { private JFrame frame = new JFrame(); private static final long serialVersionUID = 1L; private JMenuBar MenuBar; private JMenu File; private JMenuItem Exit; private JMenuItem ShowDialog; private JDialog dialog; private Point location; public ClosingFrameDialog() { Exit = new JMenuItem(" Exit "); Exit.addActionListener(new ExitListener()); ShowDialog = new JMenuItem(" Show Dialog "); ShowDialog.addActionListener(showingDialog()); File = new JMenu(" File "); File.add(Exit); File.add(ShowDialog); MenuBar = new JMenuBar(); MenuBar.add(File); frame.addWindowListener(exitListener); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setJMenuBar(MenuBar); frame.setPreferredSize(new Dimension(400, 300)); frame.setLocation(100, 100); frame.pack(); frame.setVisible(true); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createDialog(); } }); } private void createDialog() { JButton btn = new JButton(" Save changes "); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //some stuff for saving whatewer programatically dialog.setVisible(false); } }); JButton btn1 = new JButton(" Ignore changes "); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dialog.setLocationRelativeTo(frame); dialog.setVisible(false); } }); dialog = new JDialog(); dialog.add(btn); dialog.add(btn1); dialog.setVisible(false); dialog.setAlwaysOnTop(true); dialog.setModal(true); dialog.setLayout(new GridLayout(2, 0, 10, 10)); JPanel pane = (JPanel) dialog.getContentPane(); pane.setBorder(new EmptyBorder(10, 10, 10, 10)); dialog.addWindowListener(closeListener); dialog.pack(); } // private WindowListener exitListener = new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { int confirm = JOptionPane.showOptionDialog(frame, "Are You Sure to Close this Application?", "Exit Confirmation", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); if (confirm == 0) { System.exit(1); } } @Override public void windowIconified(WindowEvent e) { int confirm = JOptionPane.showOptionDialog(frame, "Are You Sure to Close this Application?", "Exit Confirmation", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); if (confirm == 0) { //System.exit(1); } } }; // private WindowListener closeListener = new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { int confirm = JOptionPane.showOptionDialog(dialog, "Are you want to save changes", "Exit Confirmation", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); if (confirm == 0) { //some stuff for saving whatewer programatically dialog.setVisible(true); } else if (confirm == 1) {// nothing only hide JDialog dialog.setVisible(true); } } }; private Action showingDialog() { return new AbstractAction("Show Dialog") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { Runnable doRun = new Runnable() { @Override public void run() { dialog.setVisible(false); location = frame.getLocationOnScreen(); int x = location.x; int y = location.y; //dialog.setLocation(x, y); dialog.setLocationRelativeTo(frame); dialog.setVisible(true); } }; SwingUtilities.invokeLater(doRun); } }; } private class ExitListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { int confirm = JOptionPane.showOptionDialog(frame, "Are You Sure to Close this Application?", "Exit Confirmation", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); if (confirm == 0) { System.exit(1); } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ClosingFrameDialog cf = new ClosingFrameDialog(); } }); } } 

你想要的方法是: setLocationRelativeTo()

将其添加为空值到JFrame,将其置于屏幕中心。 将JFrame添加到对话框将使其居中于jframe。

干杯。

 import javax.swing.JDialog; import javax.swing.JFrame; public class Centered { public static void main( String args[] ) { JFrame jFrame = new JFrame(); jFrame.setSize( 250 , 250 ); jFrame.setLocationRelativeTo( null ); jFrame.setVisible( true ); JDialog jDialog = new JDialog(); jDialog.setLocationRelativeTo( jFrame ); jDialog.setVisible( true ); } } 

在构造对话框时(当您从通常是主窗体的JFrame类中调用它时),您应该this参数作为parent参数的参数。 除非你在问题中给出代码,否则我无法提供更详细的帮助……

编辑:要将其置于父级中心,请执行以下操作:

  MyDialog dialog = new MyDialog(this, true); //or false for non-modal dialog.setLocation(this.getWidth/2 - dialog.getWidth/2, this.getHeight/2 - dialog.getHeight/2); dialog.setVisible(true);