很久沒有用過界面編程了,就當復習一下了,哈哈
成都創新互聯公司專注于松桃企業網站建設,響應式網站建設,商城網站開發。松桃網站建設公司,為松桃等地區提供建站服務。全流程按需網站設計,專業設計,全程項目跟蹤,成都創新互聯公司專業和態度為您提供的服務
如一樓所說的,給按鈕加一個監聽器ActionListener,寫一個實現方法
actionPerformed.此時當按鈕點擊時會調用actionPerformed方法,代碼如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Close extends JFrame implements ActionListener{
JButton close;
public Close(){
close = new JButton("close");//增加一個按鈕
add(close);
close.addActionListener(this);//給按鈕增加一個監聽器
setLayout(new FlowLayout());
setSize(200,100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//捕捉到按鈕點擊時的事件處理方法
//按鈕點擊時一定會自動執行actionPerformed(ActionEvent e)方法
public void actionPerformed(ActionEvent e){
//關閉整個應用程序.如果只是是想關閉當前窗口,可以用
//dispose();
System.exit(0);
}
public static void main(String[] args){
new Close();
}
}
單獨顯示Dialog略奇怪,所以我用JFrame做例子,原理是一樣的
建立一個線程,睡3秒,醒來后就把JFrame窗體關閉。
給JFrame加事件監聽,包括所有你想監聽的事件,我這里為了簡便,只監聽了鼠標單擊。一旦事件發生,則吵醒那個線程,這樣它就睡不足3秒,并且直接進入下一個迭代,繼續睡3秒。
直到有一次單擊后3秒內沒有操作,這時候線程不會觸發InterruptedException 異常,就會執行關閉窗體的操作
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
public class DummyTest {
public static void main(String[] args) {
final JFrame frame = new JFrame();
final Thread thread = new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(3000);
frame.dispose();
return;
} catch (InterruptedException e) {}
}
}
});
frame.setSize(400, 400);
frame.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
System.out.println("clicked");
thread.interrupt();
}
});
frame.setVisible(true);
thread.start();
}
}
你用的 swing 嗎?加上 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
或者加上窗口事件監聽器:
addWindowListener(new WindowAdapter() {
public void windowClosing (WindowEvent we) {
dispose();
}
});
效果圖
你想要觸發的是窗口關閉事件windowClosed, 那么你需要調用dispose方法,對窗口進行銷毀.
修改代碼如下
public?void?windowClosing(WindowEvent?e)?{
System.out.println("windowClosing--窗體正在關閉事件");
//f.setVisible(false);//隱藏窗口
f.dispose();//銷毀窗口--這行代碼會觸發windowClosed事件
}
還有其他一些細節的修改,參考下面的代碼
import?java.awt.*;
import?java.awt.event.*;
//類名不要寫一個小寫字母,推薦寫一個完整的名詞來作為類名
public?class?EventDemo?{
public?static?void?main(String[]?args)?{
Frame?f?=?new?Frame("hello");
f.setSize(300,?300);
f.setLocation(300,?200);
//f.setVisible(true);//不要先顯示窗口,?先顯示了窗口,就看不到"窗口打開事件"了
f.addWindowListener(new?WindowListener()?{
@Override
public?void?windowOpened(WindowEvent?e)?{
System.out.println("windowOpened--窗體打開事件");
}
@Override
public?void?windowIconified(WindowEvent?e)?{
System.out.println("windowIconified--窗體圖標化事件");
}
@Override
public?void?windowDeiconified(WindowEvent?e)?{
System.out.println("windowDeiconifie--窗體取消圖標化事件");
}
@Override
public?void?windowDeactivated(WindowEvent?e)?{
System.out.println("windowDeactivated--窗體停用事件");
}
@Override
public?void?windowClosing(WindowEvent?e)?{
System.out.println("windowClosing--窗體正在關閉事件");
//f.setVisible(false);//隱藏窗口
f.dispose();//銷毀窗口
}
@Override
public?void?windowClosed(WindowEvent?e)?{
System.out.println("windowClosed--窗體關閉事件");
System.exit(0);
}
@Override
public?void?windowActivated(WindowEvent?e)?{
System.out.println("windowActivated--窗體激活事件");
}
});
f.setVisible(true);//窗口顯示
}
}
1 package applicationGraphicsInOut;
2 import java.awt.*;
3 import java.awt.event.*;
4 public class ApplicationGraphicsInOut {
5 public static void main(String args[])
6 {
7 new FrameInOut();
8 }
9
10 }
11 class FrameInOut extends Frame implements ActionListener
12 {
13 Label prompt;
14 TextField input,output;
15 FrameInOut()
16 {
17 super("圖形界面的Java Application程序");
18 prompt=new Label("請輸入您的名字");
19 input=new TextField(6);
20 output=new TextField(20);
21 setLayout(new FlowLayout());
22 add(prompt);
23 add(input);
24 add(output);
25 input.addActionListener(this);
26 setSize(300,200);
27 setVisible(true);
28 }
29 public void actionPerformed(ActionEvent e)
30 {
31 output.setText(input.getText()+",歡迎你");
32 }
33 }
該程序在Eclipse下運行通過,但是就是不能關不掉!
什么原因呢?
其中有以下幾種解決方法:
1:
把main函數改為如下
1 public static void main(String args[])
2 {
3 Frame fr=new FrameInOut();
4 fr.addWindowListener(new java.awt.event.WindowAdapter()
5 {
6 public void windowClosing(java.awt.event.WindowEvent e)
7 {
8 System.exit(0);
9 }
10 });
11
12 }
這種方法我有點不解,addWindowListener()括號里是怎么回事,我有點納悶,我還沒見過這樣的形式,不過我猜可能是實現了java.awt.event.WindowAdapter()類里面的一個抽象方法windowClosing(),但是我真沒有見過這種格式,求解釋。
2:
對WINDOWS_CLOSING事件做出響應,每個窗口都有3個控制圖標,其中最小化和最大化操作Frame可自動完成,而關閉窗口的操作不能通過單擊關閉圖標實現,需要程序專門書寫有關的代碼,其實這種方法與上一種一樣,則不過換了一種格式,一種初學者更明白易懂的格式。
在FrameInOut()構造函數里面添加監聽函數,添加監聽函數之后構造函數如下:
FrameInOut()
{
super("圖形界面的Java Application程序");
prompt=new Label("請輸入您的名字");
input=new TextField(6);
output=new TextField(20);
setLayout(new FlowLayout());
addWindowListener(new HandleWin()); //添加監聽函數,引發WindowEvent事件
add(prompt);
add(input);
add(output);
input.addActionListener(this);
setSize(300,200);
setVisible(true);
}
其中HandleWin()為內部類,主要實現WindowListener借口,添加監聽之后會引發WindowEvent類代表的所以七中事件,具體情況如下:
(1)WINDOW_ACTIVATED:代表窗口被激活(在屏幕的最前方待命)。
(2)WINDOW_DEACTIVATED:代表窗口失活(其他窗口被激活后原活動窗口失活)。
(3)WINDOW_OPENED:代表窗口被打開。
(4)WINDOW_CLOSED:代表窗口被關閉(關閉窗口后發生)。
(5)WINDOW_CLOSING:代表窗口正在被關閉(指關閉前。如單擊窗口標題欄上的關閉按鈕時)。
(6)WINDOW_ICONIFIED:代表使窗口最小化成圖標。
(7)WINDOW_DEICONIFIED:代表使窗口從圖標恢復
在WindowEvent類的主要方法有:
public window getWindow();
此方法返回引發當前WindowEvent事件的具體窗口對象,與getSource()方法返回的是相同的事件引用。
HandleWin定義如下:
class HandleWin extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
(e.getWindow()).dispose();
System.exit(0);
}
}
HandleWin是窗口事件的裁剪類WindowAdapter的子類,重載了WindowClosing()方法。
當然也可以這樣寫HandleWin
1 class HandleWin implements WindowListener
2 {
3 public void windowClosing(WindowEvent e)
4 {
5 (e.getWindow()).dispose();
6 System.exit(0);
7 }
8
9 @Override
10 public void windowActivated(WindowEvent arg0) {
11 // TODO Auto-generated method stub
12
13 }
14
15 @Override
16 public void windowClosed(WindowEvent arg0) {
17 // TODO Auto-generated method stub
18
19 }
20
21 @Override
22 public void windowDeactivated(WindowEvent arg0) {
23 // TODO Auto-generated method stub
24
25 }
26
27 @Override
28 public void windowDeiconified(WindowEvent arg0) {
29 // TODO Auto-generated method stub
30
31 }
32
33 @Override
34 public void windowIconified(WindowEvent arg0) {
35 // TODO Auto-generated method stub
36
37 }
38
39 @Override
40 public void windowOpened(WindowEvent arg0) {
41 // TODO Auto-generated method stub
42
43 }
44 }
JFrame的關閉不像Frame,點關閉按鈕自己會關閉,但是那樣做不好.可以用setDefaultCloseOperation(int operation);
其中operation有以下幾種
DO_NOTHING_ON_CLOSE(在 WindowConstants 中定義):不執行任何操作;要求程序在已注冊的 WindowListener 對象的 windowClosing 方法中處理該操作。
HIDE_ON_CLOSE(在 WindowConstants 中定義):調用任意已注冊的 WindowListener 對象后自動隱藏該窗體。
DISPOSE_ON_CLOSE(在 WindowConstants 中定義):調用任意已注冊 WindowListener 的對象后自動隱藏并釋放該窗體。
EXIT_ON_CLOSE(在 JFrame 中定義):使用 System exit 方法退出應用程序。僅在應用程序中使用。
默認情況下,該值被設置為 HIDE_ON_CLOSE。更改此屬性的值將導致激發屬性更改事件,其屬性名稱為 "defaultCloseOperation"。
當前名稱:java代碼自動關閉窗體,java按鈕關閉當前窗口
標題網址:http://vcdvsql.cn/article4/hspiie.html
成都網站建設公司_創新互聯,為您提供云服務器、做網站、網站改版、標簽優化、自適應網站、企業建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯