2012-06-25 47 views
10

我有一个模态设置对话框,它是一个JDialog。在此设置窗口中,我将一些组件(包括按钮)放置到另一个也是JDialog的模式设置对话框中。我让他们JDialogs,因为这是我知道做模态对话的唯一途径。如何在另一个模态JDialog之上创建模态JDialog

问题是这样的:当我创建主要设置对话框时,我必须构建JDialog,无需父框架或父框架。由于我的主窗口是一个JFrame,我可以将它传递给主设置对话框的构造函数。但是当我想要创建第二个应该将主设置对话框设置为父级的模式设置对话框时,我找不到获取JDialog的(J)Frame的方法。我希望将该主设置对话框作为父对象传递,以便在显示时将第二个设置对话框居中。让我们假设第二个设置对话框没有构造函数来传递一个位置,只是JDialog的构造函数。

有没有办法获得JDialog的(J)框架? 我的设置是否存在设计缺陷,我是否应该使用其他设置对话框? (如果是的话,我应该怎么做这些替代的设置对话框模态?)

感谢你的帮助, 埃里克

UPDATE: 谢谢大家对你的答案。他们让我明白,显然,拥有一个JDialog的拥有者并不是绝对必要的。我认为这是对话框需要能够禁用所有者,直到对话框关闭,但显然这种形式是独立于所有者。我还注意到,即使有业主对话仍然没有集中在业主,所以现在我的代码是这样的:

public class CustomDialog extends JDialog { 
    public CustomDialog(String title) { 
     setModal(true); 
     setResizable(false); 
     setTitle(title); 

     buildGUI(); 
    } 

    public Result showDialog(Window parent) { 
     setLocationRelativeTo(parent); 
     setVisible(true); 
     return getResult(); 
    } 
} 

这也使得在模态对话框模态对话框。

感谢您的帮助!

+0

我只想没有使设置窗口对任何东西都是模态的。如果他们在设置窗口中工作时需要使用该应用程序,该怎么办?这对我来说似乎非常严格。 –

回答

13

不知道到底是什么,你有一个问题,但这里是你如何能有多个模式对话框的例子:

import java.awt.BorderLayout; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestDialog { 

    protected static void initUI() { 
     JPanel pane = newPane("Label in frame"); 
     JFrame frame = new JFrame("Title"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(pane); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    public static JPanel newPane(String labelText) { 
     JPanel pane = new JPanel(new BorderLayout()); 
     pane.add(newLabel(labelText)); 
     pane.add(newButton("Open dialog"), BorderLayout.SOUTH); 
     return pane; 
    } 

    private static JButton newButton(String label) { 
     final JButton button = new JButton(label); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Window parentWindow = SwingUtilities.windowForComponent(button); 
       JDialog dialog = new JDialog(parentWindow); 
       dialog.setLocationRelativeTo(button); 
       dialog.setModal(true); 
       dialog.add(newPane("Label in dialog")); 
       dialog.pack(); 
       dialog.setVisible(true); 
      } 
     }); 
     return button; 
    } 

    private static JLabel newLabel(String label) { 
     JLabel l = new JLabel(label); 
     l.setFont(l.getFont().deriveFont(24.0f)); 
     return l; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 
+0

不错,但为什么新的'JDialog'以楼梯的方式打开? – zygimantus

+1

@zygimantus这是直接由'dialog.setLocationRelativeTo(button)调用引起的' –

5

1.请阅读The New Modality API in Java SE 6

2.Is有没有办法让一个JDialog的(J)框架?

Window ancestor = SwingUtilities.getWindowAncestor(this); 

Window ancestor = (Window) this.getTopLevelAncestor();