我试图在我的表单JPanel中使用一些JDialog来通知用户不正确的数据和表单提交。
我对JDialog构造函数感到有些困惑。我想将对话框链接到面板(只是因为它创建了它),但显然唯一允许的所有者参数是顶级框架(我不会这样做)。我认为我可以从JPanel访问,或者对话(我无法帮助我)。
我可以将Frame的参考传递给JPanel,但是这不是一个有点奇怪的设计吗?或者我是否误解了这个类,或者更常见的是应该实例化JDialog的地方?
希望我已经清楚明白,如果它有所帮助,我可以制作一个sscce。感谢。
答案 0 :(得分:2)
JComponent.getTopLevelAncestor为您提供JPanel的所有者:
返回此组件的顶级祖先(或者 包含Window或Applet),如果没有此组件,则返回null 添加到任何容器中。
答案 1 :(得分:2)
唯一允许的所有者参数是顶级框架(我认为我不能从JPanel访问
您可以使用以下方法访问面板的父框架:
Window window = SwingUtilities.windowForComponent( yourPanelHere );
然后只需使用该窗口作为对话框的所有者。
答案 2 :(得分:0)
你可以尝试一下:
import java.awt.BorderLayout;
import java.awt.EventQueue;
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.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
public class DialogTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
EventQueue.invokeLater(new Runnable() {
public void run() {
DialogFrame frame = new DialogFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/**
* Frame contains menu. When we choose menu "File-> About" JDialog will be shown
*/
class DialogFrame extends JFrame {
public DialogFrame() {
setTitle("DialogTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// Menu
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("File");
menuBar.add(fileMenu);
// Add About & Exit.
// Choose About - > About
JMenuItem aboutItem = new JMenuItem("About");
aboutItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (dialog == null) //if not
{
dialog = new AboutDialog(DialogFrame.this);
}
dialog.setVisible(true); // to show dialog
}
});
fileMenu.add(aboutItem);
// When Exit
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
fileMenu.add(exitItem);
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
private AboutDialog dialog;
}
/*
* Modal dialog waits on click
*/
class AboutDialog extends JDialog {
public AboutDialog(JFrame owner) {
super(owner, "About DialogTest", true);
// Mark with HTML centration
add(new JLabel(
"<html><h1><i>Все о Java</i></h1><hr>"
+ "Something about java and JDialog</html>"),
BorderLayout.CENTER);
// When push "ok" dialog window will be closed
JButton ok = new JButton("ok");
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
setVisible(false);
}
});
// Button ОК down of panel
JPanel panel = new JPanel();
panel.add(ok);
add(panel, BorderLayout.SOUTH);
setSize(260, 160);
}
}