我有一个模态设置对话框,它是一个JDialog。在这个设置窗口中,我将一些组件(包括按钮)放到另一个模态设置对话框中,该对话框也是JDialog。我把它们变成了JDialogs,因为这是我所知道的唯一一种模态对话框。
问题是这样的:当我创建主设置对话框时,我必须构建JDialog,不带父框架或父框架。由于我的主窗口是JFrame,我可以将其传递给主设置对话框构造函数。但是当我想要创建第二个模态设置对话框时,它应该将主设置对话框作为父对象,我找不到获取JDialog的(J)框架的方法。我确实希望将主要设置对话框作为父对象传递,以便第二个设置对话框在显示时以中心为中心。让我们假设第二个设置对话框没有用于传递位置的构造函数,只是JDialog的构造函数。
有没有办法获得JDialog的(J)框架? 我的设置中是否存在设计缺陷,我是否应该使用其他设置对话框? (如果是这样,我应该如何将这些替代设置对话框模态化?)
感谢您的帮助, 埃里克
更新: 谢谢大家的答案。他们让我明白,显然并不是绝对有必要拥有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();
}
});
}
}
答案 1 :(得分:5)
1.请阅读The New Modality API in Java SE 6
2.有没有办法获得JDialog的(J)框架?
Window ancestor = SwingUtilities.getWindowAncestor(this);
或
Window ancestor = (Window) this.getTopLevelAncestor();
答案 2 :(得分:0)
现在是 2021 年,所以在问题发布后大约 8.5 年,但回到 2012 年,并且仍然是迄今为止最简单的解决方案,最简单的解决方案是简单地创建带有 {{1} } 作为所有者。 Java 有 5 constructors with a Dialog owner 可供选择,旁边有 5 个类似的拥有 JDialog
的所有者和 5 个拥有 Dialog
的所有者。
OP 可能面临的问题是 Netbeans 或其他一些 IDE 中 Frame
的默认模板。 Netbeans (12.2) 将此作为新 JDialog 表单... 的模板提供:
Window
您可以简单地更改构造函数的签名以使用 JDialog
作为所有者而不是 public class NewJDialog extends javax.swing.JDialog {
/**
* Creates new form NewJDialog
*/
public NewJDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
}
的默认选项:
Dialog
你走吧。