问题描述
我无法将框架设置为对话框的所有者.通常,当我扩展 JDialog 类来创建对话框时,我会使用 super(frame) 来指定对话框的所有者,这样当您按下 <代码>alt+tab.但是,当我使用 new 之类的 JDialog dialog = new JDialog() 创建对话框时,我无法将框架指定为对话框的所有者.
I am having trouble to set the frame as a owner to the dialog. Normally when I extend JDialog class for creating a dialog then I use super(frame) to specify the owner of the dialog such that both of them are not disjoint when you press alt+tab. But when I create a dialog using new like JDialog dialog = new JDialog() then I am unable to specify the frame as owner to the dialog.
以下示例演示了上述两种方法.Top Click 按钮打开一个没有扩展JDialog的对话框.底部单击按钮打开一个对话框扩展JDialog.
Following example demonstrates above two approaches. Top Click button opens a dialog which is without extending JDialog. Bottom Click button opens a dialog with extending JDialog.
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.**utton; import javax.swing.JDialog; import javax.swing.JFrame; public class DialogEx { public static void main(String[] args) { Runnable r = new Runnable() { public void run() { new DialogEx().createUI(); } }; EventQueue.invokeLater(r); } private void createUI() { final JFrame frame = new JFrame(); frame.setLayout(new BorderLayout()); **utton button1 = new **utton("Top Click"); **utton button2 = new **utton("Bottom Click"); button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { new DialogExtend(frame).createUI(); } }); button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { new DialogWithoutExtend(frame).cretaUI(); } }); frame.setTitle("Test Dialog Instances."); frame.add(button1, BorderLayout.NORTH); frame.add(button2, BorderLayout.SOUTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(new Dimension(300, 200)); frame.setVisible(true); } class DialogExtend extends JDialog { private JFrame frame; public DialogExtend(JFrame frame) { super(frame); this.frame = frame; } public void createUI() { setLocationRelativeTo(frame); setTitle("Dialog created by extending JDialog class."); setSize(new Dimension(400, 100)); setModal(true); setVisible(true); } } class DialogWithoutExtend { private JFrame frame; public DialogWithoutExtend(JFrame frame) { this.frame = frame; } public void cretaUI() { JDialog dialog = new JDialog(); dialog.setTitle("Dialog created without extending JDialog class."); dialog.setSize(new Dimension(400, 100)); dialog.setLocationRelativeTo(frame); dialog.setModal(true); dialog.setVisible(true); } } }
推荐答案
对话框(或窗口)的所有者只能在构造函数中设置,所以设置它的唯一方法是使用以所有者为参数的构造函数,如:
A dialog's (or window's) owner can be set only in the constructor, so the only way to set it is by using a constructor which takes the owner as parameter, like:
class DialogWithoutExtend { private JFrame frame; public DialogWithoutExtend(JFrame frame) { this.frame = frame; } public void cretaUI() { JDialog dialog = new JDialog(frame); dialog.setTitle("Dialog created without extending JDialog class."); dialog.setSize(new Dimension(400, 100)); dialog.setLocationRelativeTo(frame); dialog.setModal(true); dialog.setVisible(true); } }