如何创建一个窗口,让主窗口等获取到弹出窗口的返回值后再向下执行?

        在使用电脑的过程中,我们发现有些程序有它的子窗口,子窗口会让你选择东西或者输入数据,你在子窗口选择或者输入数据之后,子窗口关闭,主窗口才会继续执行。

        就像你用qq传文件的时候,点击“发送文件”按钮,会弹出让你选择文件的窗口,你选好了文件点击确定之后,qq才会进行下一步——发送文件。如果是java我们要如何实现呢?

        我对这个进行测试。我新建了一个窗口,点击上面的按钮会弹出子窗口,再点击子窗口的按钮之后子窗口关闭然后主窗口才会向下执行的代码。

        先开始我用多线程的方法搞了半天,结果动不动就“螺旋爆炸”,完全无法实现我想要的效果。搞了一下午,又是翻书又是百度,还是没有进展。晚上又查了查百度,有人说把对话框用JDialog对象创建,然后用里面的setModal()方法。我去试了试,发现果然就可以了!没想到问题没我想象的如此复杂,连多线程都不需要。。。

当场心态爆炸。。。

如何创建一个窗口,让主窗口等获取到弹出窗口的返回值后再向下执行?_第1张图片

言归正传,我们开始吧!接下来就来简单演示一下。

首先我建立两个类(Main和Frame),分别是我的主窗口(Main类)、弹出的子窗口(Frame类):

import javax.swing.*;
import java.awt.event.*;
public class Main {
	public static void main(String[] args) {
		JFrame jf=new JFrame("测试");
		jf.setSize(500,250);
		jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
		JButton jb1=new JButton("开始");
		jb1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {        //按钮事件
				new Frame().fr();        //弹出对话框
				System.out.println("对话框已被关闭");        //等待上一句执行完,再执行这个打印语句。
			}
		});
		jb1.setBounds(204, 142, 63, 27);
		JPanel jp=new JPanel();
		jp.setLayout(null);
		jp.add(jb1);
		jf.getContentPane().add(jp);
		jf.show();
	}
}

重要的是按钮事件,里面有两行代码,第一个是弹出子窗口,要等弹出的子窗口关闭了才会执行下面的System.out.println("对话框已被关闭");语句。当然如果你仅仅是创建了个普通的窗口(只创建一个JFrame对象作为子窗口)作为弹出的子窗口,你会发现子窗口打开时下面的语句一起被执行了。

所以我们要把JDialog对象作为子窗口,然后在里面使用setModal(),就可以实现这个效果了。

来看看子窗口代码:

import javax.swing.*;
import java.awt.event.*;
public class Frame {
	public void fr() {
		JDialog jd=new JDialog();
		jd.setTitle("对话框");
		jd.setSize(500,250);
		jd.setDefaultCloseOperation(jd.DISPOSE_ON_CLOSE);
		jd.setModal(true);        //参数为true时,不关闭这个子窗口,主窗口就无法进行任何操作且主窗口代码会暂停执行
		JButton jb=new JButton("关闭");
		jb.setBounds(157, 143, 153, 47);
		jb.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				jd.dispose();
			}
		});
		JPanel jp=new JPanel();
		jd.getContentPane().add(jp);
		jp.setLayout(null);
		jp.add(jb);
		jd.show();
	}
}

JDialog也继承了Window类,所以我们也可以用JFrame里面的许多方法来自定义其样式。

不过这里的重点是jd.setModal(true),使我们的子窗口模态显示,模态显示时主窗口就不能使用了,点不动,且主窗口代码也暂停了,直到关闭这个小窗口。

看来实现这个效果还是很简单的,一句话就解决了。大家还可以在JDialog所在类里面加一些其它的东西,让它关闭的时候给主窗口一些数据,然后主窗口再处理这个数据。

你可能感兴趣的:(电脑,Java,笔记)