在使用電腦的過程中,我們發現有些程序有它的子窗口,子窗口會讓你選擇東西或者輸入數據,你在子窗口選擇或者輸入數據之後,子窗口關閉,主窗口才會繼續執行。
就像你用qq傳文件的時候,點擊“發送文件”按鈕,會彈出讓你選擇文件的窗口,你選好了文件點擊確定之後,qq纔會進行下一步——發送文件。如果是java我們要如何實現呢?
我對這個進行測試。我新建了一個窗口,點擊上面的按鈕會彈出子窗口,再點擊子窗口的按鈕之後子窗口關閉然後主窗口纔會向下執行它的代碼。
先開始我用多線程的方法搞了半天,結果動不動就“螺旋爆炸”,完全無法實現我想要的效果。搞了一下午,又是翻書又是百度,還是沒有進展。晚上又查了查百度,有人說把對話框用JDialog對象創建,然後用裏面的setModal()方法。我去試了試,發現果然就可以了!沒想到問題沒我想象的如此複雜,連多線程都不需要。。。
當場心態爆炸。。。
言歸正傳,我們開始吧!接下來就來簡單演示一下。
首先我建立兩個類(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所在類裏面加一些其它的東西,讓它關閉的時候給主窗口一些數據,然後主窗口再處理這個數據。