Java學(xué)習(xí)筆記之Swing(一)
學(xué)習(xí)目標(biāo)
- 了解Swing的基本開(kāi)發(fā)過(guò)程昧互。
- 掌握如何創(chuàng)建窗口航瞭、面板、標(biāo)簽和按鈕你踩。
- 掌握和熟練使用Swing中的事件。
Swing的第一個(gè)程序
import javax.swing.*;
public class Swing1 extends JFrame{
public Swing1 {
this.setLayout(null);//設(shè)置布局管理器
JLabel jl=new JLabel();//定義一個(gè)標(biāo)簽
jl.setText("第一個(gè)Swing程序"); //設(shè)置顯示的文字
jl.setBounds(50,50,400,50); //設(shè) 置標(biāo)簽的大小和位置
this.add(jl); //將標(biāo)簽放到窗口中
this.setBounds(300,250,500,200); //設(shè)置窗口的大小和位置
this.setVisible(true); //設(shè)置窗口是可見(jiàn)的
}
public static void main(String args[]){
Swing1 s=new Swing1();
}
}
JFrame窗口類(lèi)簡(jiǎn)介
在開(kāi)發(fā)Swing程序中,通常是通過(guò)繼承JFrame類(lèi)來(lái)實(shí)現(xiàn)窗口的带膜。在該類(lèi)中具有包括定義窗口標(biāo)題吩谦、標(biāo)框,以及窗口的 大小和位置等眾多方法膝藕。在介紹這些方法之前式廷,先來(lái)介紹一下JFrame窗口類(lèi)的構(gòu)造器。JFrame窗口類(lèi)具有四種構(gòu)造器芭挽。
最常用的JFrame窗口類(lèi)的構(gòu)造器是無(wú)參構(gòu)造器滑废,使用該構(gòu)造器將創(chuàng)建一 個(gè)初始不可見(jiàn)的新窗體。除此之外還有具有一個(gè)String類(lèi)參數(shù)的構(gòu)造器览绿,使用該構(gòu)造器能夠在初始時(shí)就創(chuàng)建一個(gè)具有標(biāo)題的新窗體策严。還有兩種 需要給出圖形配置參數(shù)的構(gòu)造器穗慕,這兩種構(gòu)造器此處不進(jìn)行介紹饿敲。
創(chuàng)建新窗口后,就可以通過(guò)JFrame窗口類(lèi)的方法來(lái)設(shè)置新窗口逛绵。首先使 用無(wú)參構(gòu)造器創(chuàng)建的是一個(gè)不可見(jiàn)的新窗體怀各,所以要使用方法來(lái)將窗體 設(shè)置為可見(jiàn)的形式。在JFrame窗口類(lèi)中定義了一個(gè)setVisible方法來(lái)設(shè) 置窗口的可見(jiàn)性术浪,該方法具有一個(gè)布爾型參數(shù)瓢对,true表示可見(jiàn),false表 示不可見(jiàn)胰苏。將初始狀態(tài)下的窗口設(shè)置為不可見(jiàn)是有原因的硕蛹,因?yàn)橛泻芏?對(duì)窗口的操作需要在窗口不可見(jiàn)的狀態(tài)下執(zhí)行,從而setVisible方法通 過(guò)在程序的最后執(zhí)行硕并。
在JFrame窗口類(lèi)中有個(gè)setTitle方法法焰,該方法需要一個(gè)字符型參 數(shù)。使用setTitle方法可以設(shè)置窗口的名稱(chēng);還有一個(gè)setBounds方法倔毙,該方法具有4個(gè)參數(shù)埃仪,前兩個(gè)參數(shù)分別表示窗口位置的橫坐標(biāo)和縱坐標(biāo),后兩個(gè)參數(shù)分別表示窗口大小的寬度和高度陕赃。 JFrame窗口類(lèi)最重要的方法就是add方法卵蛉,使用該方法可以將組 件添加到窗口中。除此之外么库,該類(lèi)中常用的方法還有setResizable傻丝,使用該方法可是設(shè)置窗口是否允許調(diào)整大小。
JFrame類(lèi)中還有一個(gè)重要的方法诉儒,即setDefaultCloseOperation.使用該方法可是設(shè)置單擊關(guān)閉窗口時(shí)執(zhí)行的動(dòng)作葡缰。這里的動(dòng)作包括四種情況:
- DO_NOTHING_ON_CLOSE:不執(zhí)行任何動(dòng)作;
- DIPOSE_ON_CLOSE:釋放窗體對(duì)象;
- HIDE_ON_CLOSE: 隱藏窗體运准;
- EXIT_ON_CLOSE: 退出JVM幌氮。
注意:如果不對(duì)該值進(jìn)行設(shè)置,默認(rèn)的值為HIDE_ON_CLOSE胁澳,也就是默認(rèn)情況下單擊關(guān)閉按鈕會(huì)隱藏窗口该互。
JPanel類(lèi)
JPnael類(lèi)與上面的JFrame類(lèi)一樣,都屬于一個(gè)容器類(lèi)韭畸。在正式介紹該類(lèi)之前我們需要先介紹一下什么是容器宇智。
Swing中的控件可以分為三類(lèi),頂層容器胰丁、非頂層容器和普通控件随橘。JFrame就屬于一個(gè)頂層容器。頂層容器是一種可以直接顯示在系統(tǒng)桌面的控件锦庸,其他控件必須直接或間接的借助頂層容器來(lái)顯示机蔗。頂層容器除了包括JFrame類(lèi)外,還包括JWindow類(lèi)和JDialog類(lèi)甘萧。
JPnael類(lèi)屬于一個(gè)非頂層容器類(lèi)萝嘁。非頂層容器具有兩面性,非頂層容器需要放到頂層容器中使用扬卷,對(duì)于頂層容器來(lái)說(shuō)牙言,非頂層容器只是屬于一般的控件。當(dāng)我們?cè)诜琼攲尤萜髦刑砑涌丶r(shí)怪得,對(duì)這些控件而言咱枉,非頂層容器就屬于一個(gè)容器。
JPnael面板類(lèi)簡(jiǎn)介
JPanel類(lèi)是一個(gè)非頂層容器類(lèi)徒恋,它具有四種構(gòu)造器蚕断,最常用的依然是無(wú)參構(gòu)造器,使用有參構(gòu)造器可以設(shè)置面板使用什么樣的布局管理器和是否使用雙緩沖因谎。JPanel面板類(lèi)具有一個(gè)添加控件的add方法基括,使用該方法可以將普通控件添加到面板中。getHeight和getWidth方法可以返回當(dāng)前面板的高度和寬度财岔。JPanel類(lèi)中還有一個(gè)重要的setToolTipText方法,該方法具有一個(gè)字符串參數(shù)风皿,該方法的作用是當(dāng)鼠標(biāo)指針停在面板上時(shí)顯示文本內(nèi)容,字符串指定的就是所要顯示的文本匠璧。
JLabel標(biāo)簽類(lèi)
標(biāo)簽是Swing中最基本的控件桐款,它是一種非交互式的控件。JLabel有六個(gè)構(gòu)造器:
標(biāo)簽構(gòu)造器 | 說(shuō)明 |
---|---|
public void JLabel() | 創(chuàng)建沒(méi)有圖像和標(biāo)題的標(biāo)簽 |
public void JLabel(Icon image) | 創(chuàng)建具有圖像的標(biāo)簽 |
public void JLabel(Icon image,int horizontalAlignment) | 創(chuàng)建具有圖像和指定對(duì)齊方式的標(biāo)簽 |
public void JLanel(String text) | 創(chuàng)建指定文本的標(biāo)簽 |
public void JLable(String text,int horizontalAlignment) | 創(chuàng)建指定文本和指定對(duì)齊方式的標(biāo)簽 |
public void JLabel(String text,Icon image,int horizontalAlignment) | 創(chuàng)建指定文本夷恍、圖像和指定對(duì)齊方式的標(biāo)簽 |
創(chuàng)建一個(gè)標(biāo)簽的程序如下:
import javax.swing.*;
//繼承JFrame類(lèi)
public class Swing8 extends JFrame
JLabel jl=new JLabel(); //定義構(gòu)造器
public Swing8()
{
this.setTitle("創(chuàng)建標(biāo)簽");
jl.setText("這是一個(gè)標(biāo)簽"); jl.setVerticalAlignment(JLabel.CENTER);//設(shè)置標(biāo)簽垂直居中
jl.setHorizontalAlignment(JLabel.CENTER);//設(shè)置標(biāo)簽水平居中
this.add(jl); //將標(biāo)簽添加到窗口中
this.setBounds(300,250,300,200); //設(shè)置窗口的大小和位置
this.setVisible(true); //設(shè)置窗口是可見(jiàn)的
}
public static void main(String args[]) {
Swing8 s=new Swing8();
}
運(yùn)行結(jié)果:
JButton按鈕類(lèi)
JButton類(lèi)也有多個(gè)構(gòu)造器魔眨,最常用的依然是無(wú)參構(gòu)造器。在JButton按鈕類(lèi)中具有幾個(gè)很常用的方法。其中setText方法是 來(lái)設(shè)置按鈕上顯示的文本遏暴,和其對(duì)應(yīng)的是用getText方法來(lái)獲取按 鈕上顯示的文本侄刽。在JButton按鈕類(lèi)中還有一個(gè)經(jīng)常被使用,即setMnemonic方法朋凉,使用該方法可以設(shè)置按鈕的助記符州丹。助記符就是使用鍵盤(pán)中的Alt加該助記符就能起到相應(yīng)的功能。
創(chuàng)建一個(gè)簡(jiǎn)單按鈕的實(shí)例如下:
import javax.swing.*;
//繼承JFrame類(lèi)
public class Swing9 extends JFrame
{
JButton jb=new JButton(); //定義構(gòu)造器
public Swing9()
{
this.setTitle("創(chuàng)建按鈕");
jb.setText("這是一個(gè)按鈕"); //設(shè)置按鈕上顯示的內(nèi)容
jb.setMnemonic('a'); //設(shè)置按鈕的助記符
this.add(jb); //將按鈕添加到窗口中
this.setBounds(300,250,300,200); //設(shè)置窗口的大小和位置
this.setVisible(true); //設(shè)置窗口是可見(jiàn)的
}
public static void main(String args[]) {
Swing9 s=new Swing9();
}
編譯運(yùn)行上面的實(shí)例代碼之后杂彭,創(chuàng)建出一個(gè)窗口墓毒,整個(gè)窗口中只有一個(gè)按鈕,而且按鈕沾滿(mǎn)了整個(gè)窗口亲怠。當(dāng)我們從鍵盤(pán)上按下Alt+A組合鍵時(shí)相當(dāng)于點(diǎn)擊了這個(gè)按鈕所计。這就是助記符的作用。
Swing中的事件
事件是一種很好的用戶(hù)和界面的交互手段团秽。在事件的發(fā)生和響應(yīng)的過(guò)程中需要兩個(gè)對(duì)象主胧,事件監(jiān)聽(tīng)器和事件源。事件源就是我們常見(jiàn)的一些可交互的控件徙垫,例如按鈕讥裤、文本框和窗口等。但是不同的控件是存在不同的事件的姻报,事件信息被封裝在事件對(duì)象 中。事件監(jiān)聽(tīng)器是指實(shí)現(xiàn)專(zhuān)門(mén)的監(jiān)聽(tīng)接口的類(lèi)的對(duì)象间螟。每一個(gè)事件都有 對(duì)應(yīng)的監(jiān)聽(tīng)接口吴旋,同時(shí)在該接口中給出了處理事件的方法。在編寫(xiě)監(jiān)聽(tīng) 器時(shí)需要事件監(jiān)聽(tīng)接口厢破,同時(shí)實(shí)現(xiàn)其中的方法荣瑟,在方法中編寫(xiě)觸發(fā)事件 后執(zhí)行的程序。在編寫(xiě)程序時(shí)摩泪,還需要將監(jiān)聽(tīng)器注冊(cè)給事件源笆焰,這樣才能執(zhí)行事件。
同一個(gè)事件源注冊(cè)多個(gè)監(jiān)聽(tīng)器:
同一個(gè)事件源可以同時(shí)注冊(cè)多個(gè)監(jiān)聽(tīng)器见坑,這種情況下觸發(fā)事件嚷掠, 所有的監(jiān)聽(tīng)器都將執(zhí)行事件方法,對(duì)事件進(jìn)行處理荞驴。
當(dāng)為同一個(gè)事件源注冊(cè)多個(gè)監(jiān)聽(tīng)器時(shí)不皆,監(jiān)聽(tīng)器的執(zhí)行順序并不是 先注冊(cè)先執(zhí)行的順序,而是先注冊(cè)后執(zhí)行的順序來(lái)執(zhí)行的熊楼。
實(shí)例代碼:
import javax.swing.*;
public class Swing5 extends JFrame{
JButton jb=new JButton();
int i=0;//按鈕被單擊的次數(shù)
public Swing5(){
this.setTitle("創(chuàng)建按鈕");
jb.setText("按鈕按下了0次");
jb.setMnemonic('a');
this.add(jb);
//為按鈕注冊(cè)監(jiān)聽(tīng)器
jb.addActionListener(new ActionListener() {
//觸發(fā)事件時(shí)執(zhí)行的方法
public void actionPerformed(ActionEvent e){
Swing5.this.jb.setText("按鈕按下了"+(++i)+"次");
}
});
//為按鈕注冊(cè)第二個(gè)監(jiān)聽(tīng)器
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Swing5.this.jb.setText("按鈕按下了"+(++i)+"次");
}
});
this.setBounds(100,200,300,250);
this.setVisible(true);
}
public static void main(String args[]){
Swing5 s=new Swing5();
}
}
同一個(gè)監(jiān)聽(tīng)器注冊(cè)給多個(gè)事件源
同一個(gè)監(jiān)聽(tīng)器注冊(cè)給多個(gè)事件源的情況下霹娄,所有的事件源中的任 意一個(gè)觸發(fā)事件都會(huì)通知監(jiān)聽(tīng)器,并執(zhí)行監(jiān)聽(tīng)器中的事件處理方法。將一個(gè)監(jiān)聽(tīng)器注冊(cè)給多個(gè)事件源犬耻,從而不管是單擊哪一個(gè)按鈕踩晶,都將執(zhí)行監(jiān)聽(tīng)器方法。為了辨別是哪一個(gè)按鈕被按下枕磁,在監(jiān)聽(tīng)器方法中需要判斷是哪一個(gè)按鈕觸發(fā)了事件合瓢,執(zhí)行的效果是使另一個(gè)按鈕的顯示內(nèi)容發(fā)生變化。
窗體獲取和失去焦點(diǎn)事件
窗體中的所有事件都是使用WindowEvent類(lèi)來(lái)表示透典。窗體獲取和失去焦點(diǎn)事件晴楔,該事件是通過(guò)實(shí)現(xiàn) WindowFocusListener監(jiān)聽(tīng)接口實(shí)現(xiàn)的。
窗體打開(kāi)峭咒、關(guān)閉和激活事件
要實(shí)現(xiàn)窗體打開(kāi)税弃、關(guān)閉和激活事件只需要實(shí)現(xiàn)WindowListener監(jiān)聽(tīng)接口的監(jiān)聽(tīng)器。
按鈕事件
按鈕時(shí)具有事件的凑队,當(dāng)我們單擊按鈕時(shí)就出發(fā)了按鈕事件则果,即ActionEvent事件。如果我們希望按鈕事件觸發(fā)后執(zhí)行我們指定的程序漩氨,我們需要為按鈕添加動(dòng)作事件監(jiān)聽(tīng)器西壮,并且需要為按鈕注冊(cè)動(dòng)作事件監(jiān)聽(tīng)器。編寫(xiě)動(dòng)作事件監(jiān)聽(tīng)器需要通過(guò)實(shí)現(xiàn)ActionListener監(jiān)聽(tīng)接口來(lái)完成叫惊。
在ActionListener監(jiān)聽(tīng)接口中只有一個(gè)actionPerformed方法款青,所以在動(dòng)作事件監(jiān)聽(tīng)器中只需要實(shí)現(xiàn)這個(gè)方法。我們可以將觸發(fā)事件后需要執(zhí)行的程序?qū)懺?strong>actionPerformed方法中霍狰。定義完監(jiān)聽(tīng)器后抡草,我們還需要向按鈕注冊(cè)該監(jiān)聽(tīng)器,注冊(cè)監(jiān)聽(tīng)器可以通過(guò)addActionListener方法來(lái)完成蔗坯。