Java學(xué)習(xí)筆記之Swing(一)

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方法基括,使用該方法可以將普通控件添加到面板中。getHeightgetWidth方法可以返回當(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é)果:

label.png

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)完成蔗坯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末康震,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宾濒,更是在濱河造成了極大的恐慌腿短,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绘梦,死亡現(xiàn)場(chǎng)離奇詭異橘忱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)谚咬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)鹦付,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人择卦,你說(shuō)我怎么就攤上這事敲长±杉蓿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵祈噪,是天一觀(guān)的道長(zhǎng)泽铛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辑鲤,這世上最難降的妖魔是什么盔腔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮月褥,結(jié)果婚禮上弛随,老公的妹妹穿的比我還像新娘。我一直安慰自己宁赤,他們只是感情好舀透,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著决左,像睡著了一般愕够。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佛猛,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天惑芭,我揣著相機(jī)與錄音,去河邊找鬼继找。 笑死遂跟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的码荔。 我是一名探鬼主播漩勤,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缩搅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起触幼,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硼瓣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后置谦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體堂鲤,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年媒峡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘟栖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谅阿,死狀恐怖半哟,靈堂內(nèi)的尸體忽然破棺而出酬滤,到底是詐尸還是另有隱情,我是刑警寧澤寓涨,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布盯串,位于F島的核電站,受9級(jí)特大地震影響戒良,放射性物質(zhì)發(fā)生泄漏体捏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一糯崎、第九天 我趴在偏房一處隱蔽的房頂上張望几缭。 院中可真熱鬧,春花似錦沃呢、人聲如沸年栓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)韵洋。三九已至,卻和暖如春黄锤,著一層夾襖步出監(jiān)牢的瞬間搪缨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工鸵熟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留副编,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓流强,卻偏偏與公主長(zhǎng)得像痹届,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子打月,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1队腐、窗體 1、常用屬性 (1)Name屬性:用來(lái)獲取或設(shè)置窗體的名稱(chēng)奏篙,在應(yīng)用程序中可通過(guò)Name屬性來(lái)引用窗體柴淘。 ...
    Moment__格調(diào)閱讀 4,549評(píng)論 0 11
  • 面向?qū)ο笾饕槍?duì)面向過(guò)程。 面向過(guò)程的基本單元是函數(shù)秘通。 什么是對(duì)象:EVERYTHING IS OBJECT(萬(wàn)物...
    sinpi閱讀 1,057評(píng)論 0 4
  • 1.import static是Java 5增加的功能,就是將Import類(lèi)中的靜態(tài)方法为严,可以作為本類(lèi)的靜態(tài)方法來(lái)...
    XLsn0w閱讀 1,227評(píng)論 0 2
  • 昨晚看得《情敵蜜月》,本來(lái)是無(wú)聊加著沖著封面上的霍建華肺稀,但是電影結(jié)束之后第股,我并沒(méi)有被高顏值滿(mǎn)足的飽食感,反而是喉間...
    楚楚玖閱讀 1,011評(píng)論 1 1
  • 那還是在七八年前话原,做人力資源顧問(wèn)公司時(shí)認(rèn)識(shí)的一個(gè)叫大美的姑娘夕吻。她長(zhǎng)的胖乎乎诲锹,圓圓的臉,圓圓的身體梭冠,算不上漂亮辕狰。 那...
    心怡雨文閱讀 160評(píng)論 0 0