我正在开发一个包含多个JFrame
和JDialog
窗口的程序。
我有一个包含按钮的JFrame,当我点击这个按钮时,会打开一个JDialog窗口。在这个JDialog窗口中有另一个按钮,单击它时会打开第二个JDialog窗口。在第二个JDialog窗口中,我有一个最后一个按钮。
我想要做的是在点击最后一个按钮时关闭JDialog
窗口和JFrame
窗口。
这是开盘订单的方式:
JFrame Frame1;
JButton Button1;
JDialog Dialog1;
JButton Button2;
JDialog Dialog2;
JButton Button3;
Button1ActionPerformed(ActionEvent e){
new Dialog(Frame1Frame);
}
Button2ActionPerformed(ActionEvent e){
new Dialog2(Dialog1Frame)
}
Button3ActionPerformed(ActionEvent e){
//Here I wnat to add the code that closes JDialog2 JDialog1 and JFrame1 windows.
}
我尝试了super.dispose();
,但它没有用。有什么想法吗?
答案 0 :(得分:1)
可能有更好的方法可以做到这一点,但这是一种可能有用的一般方法。
在您的代码中,您可以创建窗口,但不会将对创建的窗口的引用存储到变量中。例如,您有:
JDialog Dialog1;
然后,当您创建Dialog1的实例时,您有以下代码:
Button1ActionPerformed(ActionEvent e){
new Dialog(Frame1Frame);
}
这意味着您已经创建了Dialog,但是您没有保留对Dialog的引用,以便稍后通过代码进行操作。如果您在此处指定此值,则应该可以稍后对其进行操作。
如果您将实施更改为:
Button1ActionPerformed(ActionEvent e){
Dialog1 = new Dialog(Frame1Frame);
}
然后在您的代码中,您将有一个对话框的引用,以便操作它,
Button3ActionPerformed(ActionEvent e){
Dialog1.dispose();
// you can manipulate the variables of the class from here and close other windows etc.
}
答案 1 :(得分:1)
如果你有对象参考,你可以这样做:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class Main
{
private static JFrame frame;
private static JButton buttonFrame;
private static JDialog dialog1;
private static JButton buttonDialog1;
private static JDialog dialog2;
private static JButton buttonDialog2;
public static void main(String[] args) {
/* frame */
frame = new JFrame("Main Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
buttonFrame = new JButton("open dialog 1");
buttonFrame.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
dialog1.setVisible(true);
}
});
frame.add(buttonFrame);
/* dialog 1 */
dialog1 = new JDialog(frame, "Dialog 1");
dialog1.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog1.setSize(300, 300);
dialog1.setLocationRelativeTo(null);
buttonDialog1 = new JButton("open dialog 2");
buttonDialog1.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
dialog2.setVisible(true);
}
});
dialog1.add(buttonDialog1);
/* dialog 2 */
dialog2 = new JDialog(dialog1, "Dialog 2");
dialog2.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog2.setSize(200, 200);
dialog2.setLocationRelativeTo(null);
buttonDialog2 = new JButton("close all");
buttonDialog2.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
dialog2.dispose();
dialog1.dispose();
frame.dispose();
}
});
dialog2.add(buttonDialog2);
/* show frame */
frame.setVisible(true);
}
}
否则您可以使用System.exit(0);
:
buttonDialog2.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
答案 2 :(得分:1)
使用here显示Action
,您的actionPerformed()
实施可以将WINDOW_CLOSING
事件发送到所需的Window
个实例。
@Override
public void actionPerformed(ActionEvent e) {
d1.dispatchEvent(new WindowEvent(d1, WindowEvent.WINDOW_CLOSING));
d2.dispatchEvent(new WindowEvent(d2, WindowEvent.WINDOW_CLOSING));
f1.dispatchEvent(new WindowEvent(f1, WindowEvent.WINDOW_CLOSING));
}