Java的圖形用戶界面_第1頁
Java的圖形用戶界面_第2頁
Java的圖形用戶界面_第3頁
Java的圖形用戶界面_第4頁
Java的圖形用戶界面_第5頁
已閱讀5頁,還剩205頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java的圖形用戶界面java.awt包與javax.swing包java.awt包稱為抽象窗口工具集AWT(AbstractWindowToolkit),是使用Java進(jìn)行GUI設(shè)計(jì)的基礎(chǔ)功能

用戶界面組件事件處理模型圖形和圖像工具布局管理器程序的GUI部分由AWT線程管理在特定平臺(tái)上,每個(gè)AWT組件對(duì)象都有一個(gè)控制該對(duì)象外觀顯示的本地對(duì)等組件對(duì)象ButtonButtonPeerWindowsButtonPeerMotifButtonPeerMacOsButtonPeer平臺(tái)無關(guān)的API和實(shí)現(xiàn)特定于平臺(tái)的實(shí)現(xiàn)javax.swing包

幾乎所有AWT組件對(duì)應(yīng)有功能更強(qiáng)的Swing組件

java.awt.Framejavax.swing.JFrame加入了一些全新的組件

Swing組件都是AWT的Container類的直接子類和間接子類。

java.awt.Component

-java.awt.Container-java.awt.Panel-java.applet.Applet-java.awt.ScrollPane

-java.awt.Window

-java.awt.Frame-javax.swing.JFrame

-java.awt.Dialog-javax.swing.JDialog

-javax.swing.JWindow

-java.awt.Applet-javax.swing.JApplet

-javax.swing.Jcomponet-javax.swing.JPanelAWT組件與Swing組件重量級(jí)組件代碼依賴于底層操作系統(tǒng),并且存在一個(gè)對(duì)等組件做對(duì)應(yīng),將事件傳遞給對(duì)等組件處理。AWT組件是重量級(jí)的輕量級(jí)組件

沒有本地代碼,不依賴操作系統(tǒng)的支持具有平臺(tái)獨(dú)立的API并且有平臺(tái)獨(dú)立的實(shí)現(xiàn)Swing組件是輕量級(jí)的Swing組件以J開頭增加了一個(gè)豐富的高層組件集合,如表格(JTable)、樹(JTree)。

在Swing中,JFrame,JDialog,JWindow,JApplet這四個(gè)組件被稱為重量級(jí)組件(頂層容器),它們必須使用本地代碼來顯示窗口畫面。Swing組件不能直接添加到頂層容器中,必須添加到一個(gè)與Swing頂層容器相關(guān)聯(lián)的內(nèi)容面板(contentpane)上。publicContainergetContentPane()內(nèi)容面板是頂層容器包含的一個(gè)普通容器,它是一個(gè)輕量級(jí)組件。一個(gè)簡(jiǎn)單的圖形用戶界面程序importjavax.swing.*;classWinextendsJFrame{JButtonbtn;Win(Strings){super(s);

btn=newJButton("hello");

getContentPane().add(btn);setSize(600,300);setVisible(true);validate();}}publicclassSimpleExp{publicstaticvoidmain(String[]args){newWin("MyWindow");}}添加布局管理和事件處理importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;classWinextendsJFrameimplementsActionListener{JButtonbtn;Win(Strings){super(s);btn=newJButton("hello");

btn.addActionListener(this);getContentPane().add(btn);

getContentPane().setLayout(newFlowLayout());setSize(600,300);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){

btn.setBackground(Color.red);}}publicclassSimpleExp{publicstaticvoidmain(String[]args){newWin("MyWindow");}}布局管理器FlowLayout流式布局GridLayout網(wǎng)格布局BorderLayout邊界布局CardLayout卡片布局BoxLayout盒式布局GridBagLayout網(wǎng)格包布局FlowLayout布局Applet、Panel、JPanel型容器的默認(rèn)布局布局方式組件按加入的先后順序從左到右排列通過設(shè)置componentOrientation屬性改變流的方向LEFT_TO_RIGHTRIGHT_TO_LEFTUNKNOWN一行排滿后自動(dòng)換行每一行中的組件都居中排列每一個(gè)組件的大小為默認(rèn)的最佳大小組件間的默認(rèn)水平和垂直間隙是5個(gè)像素常用方法

publicvoidsetPreferredSize(Dimension)

java.awt.Component

組件改變最佳大小的函數(shù)組件調(diào)用setSize(intx,inty)設(shè)置的大小無效

publicvoidsetAlignment(int

align)

重新設(shè)置布局的對(duì)齊方式FlowLayout.LEFT

FlowLayout.RIGHTFlowLayout.CENTER

FlowLayout.LEADING

FlowLayout.TRAILING每一行組件沿容器方向的開始邊界對(duì)齊每一行組件沿容器方向的結(jié)束邊界對(duì)齊常用方法

publicvoidsetHgap(int

hgap)重新設(shè)置組件間及組件和容器邊界間的水平間隙publicvoidsetVgap(int

vgap)重新設(shè)置組件間及組件和容器邊界間的垂直間隙

publicvoidsetComponentOrientation(ComponentOrientation

o)java.awt.ComponentContainercon=getContentPane();con.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);importjava.awt.*;importjavax.swing.*;classWindowFlowextendsJFrame{JButtonb[]=newJButton[10];WindowFlow(Strings){super(s);

FlowLayoutflow=newFlowLayout();

flow.setAlignment(FlowLayout.LEFT);

flow.setHgap(2);

flow.setVgap(8);

setLayout(flow);for(inti=1;i<b.length;i++){b[i]=newJButton("Iam"+i);if(i>=8)

b[i].setPreferredSize(newDimension(70,70));add(b[i]);}setBounds(100,100,350,160);setVisible(true);validate();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}}publicclassFlowLayoutExp{publicstaticvoidmain(String[]args){WindowFlowwin=newWindowFlow("FlowLayout布局窗口");}}WindowConstants接口中的常量BorderLayout布局是Window型容器(如Window、Dialog、Frame)的默認(rèn)布局布局方式容器空間劃分為東、西、南、北、中5個(gè)區(qū)域

CENTER(默認(rèn))NORTHSOUTHWESTEAST中間區(qū)域最大,添加組件時(shí)應(yīng)指明所添加的區(qū)域,且組件將占據(jù)整個(gè)區(qū)域至多添加5個(gè)組件當(dāng)用戶改變?nèi)萜鞔翱诖笮r(shí),各個(gè)組件的相對(duì)位置不變,而組件大小改變常用方法publicBorderLayout()

構(gòu)造一個(gè)組件之間沒有間距的新邊框布局。

publicBorderLayout(int

hgap,int

vgap)

構(gòu)造一個(gè)具有指定組件間距的邊框布局。水平間距由hgap指定,垂直間距由vgap指定。

publicvoidadd(Componentcomp,Objectconstraints)java.awt.Container

將指定的組件添加到此容器的尾部。同時(shí)通知布局管理器使用指定的constraints對(duì)象將組件添加到此容器的布局中。publicComponentadd(Stringname,Componentcomp)在BorderLayout類中,定義了表示方位的5個(gè)publicstaticfinalString類型的常量:EAST(值為”East”)、WEST(值為”West”)、SOUTH(值為”South”)、NORTH(值為“North”)、CENTER(值為”Center”)將指定組件添加到此容器中并返回該組件importjava.awt.*;importjavax.swing.*;publicclassBorderLayoutExp{publicstaticvoidmain(String[]args){JFramewin=newJFrame("窗體");win.setBounds(100,100,600,300);win.setVisible(true);JButtonbSouth=newJButton("我在南邊"),bNorth=newJButton("我在北邊"),bEast=newJButton("我在東邊"),bWest=newJButton("我在西邊"),bCenter=newJButton("我在中心");

win.add(bNorth,BorderLayout.NORTH);win.add(bSouth,BorderLayout.SOUTH);win.add(bEast,BorderLayout.EAST);win.add(bWest,BorderLayout.WEST);win.add(bCenter,BorderLayout.CENTER);

win.validate();win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}CardLayout布局布局方式可容納多個(gè)組件,組件被層疊放入容器中最先加入容器的組件位于最上層,依次向下排序每次只能顯示一個(gè)組件,被顯示組件占據(jù)所有的容器空間卡片通常為一個(gè)Panel對(duì)象當(dāng)需要許多面板切換,而每個(gè)面板需要顯示為不同布局時(shí),可以使用卡片布局常用方法

publicCardLayout()

創(chuàng)建一個(gè)間距大小為0的新卡片布局。publicCardLayout(int

hgap,int

vgap)創(chuàng)建一個(gè)具有指定水平間距和垂直間距的新卡片布局。水平間距置于左右邊緣。垂直間距置于上下邊緣。

publicComponentadd(String

name,Component

comp)java.awt.Container將指定組件添加到此容器中并返回該組件

publicvoidshow(Container

parent,String

name)翻轉(zhuǎn)到容器中具有指定name的組件。

publicvoidfirst(Container

parent)

翻轉(zhuǎn)到容器的第一張卡片publicvoidlast(Container

parent)翻轉(zhuǎn)到容器的最后一張卡片publicvoidprevious(Container

parent)翻轉(zhuǎn)到指定容器的前一張卡片

publicvoidnext(Container

parent)翻轉(zhuǎn)到指定容器的后一張卡片importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;classWindowCardextendsJFrameimplementsActionListener{JPanelp1;JLabellab1,lab2,lab3;JButtonb1;WindowCard(Strings){super(s);p1=new

JPanel(newCardLayout());

lab1=newJLabel("thisisone!");lab2=newJLabel("thisistwo!");lab3=newJLabel("thisisthree!");b1=newJButton("next");

p1.add("one",lab1);

p1.add("two",lab2);p1.add("three",lab3);

((CardLayout)p1.getLayout()).show(p1,"one");

setLayout(newGridLayout(2,1));add(p1);add(b1);

b1.addActionListener(this);setBounds(100,100,600,300);setVisible(true);validate();}

publicvoidactionPerformed(ActionEvente){

((CardLayout)p1.getLayout()).next(p1);}}publicclassCardLayoutExp{publicstaticvoidmain(String[]args){WindowCardwin=newWindowCard("CardLayout布局窗口");}}GridLayout布局布局方式把容器劃分成若干行乘若干列的網(wǎng)格區(qū)域,每個(gè)網(wǎng)格大小相同組件按進(jìn)入容器的順序裝入網(wǎng)格中(從第一行到最后一行,每行從左到右),強(qiáng)制組件與網(wǎng)格的大小相同常用方法

publicGridLayout()創(chuàng)建具有默認(rèn)值的網(wǎng)格布局,即每個(gè)組件占據(jù)一行一列。publicGridLayout(int

rows,int

cols)

創(chuàng)建具有指定行數(shù)和列數(shù)的網(wǎng)格布局,0為任意值publicGridLayout(int

rows,int

cols,int

hgap,int

vgap)

創(chuàng)建具有指定行數(shù)和列數(shù)的網(wǎng)格布局。將水平和垂直間距設(shè)置為指定值。常用方法

publicintgetRows()

獲取此布局中的行數(shù)

publicintgetColumns()

獲取此布局中的列數(shù)

publicintgetHgap()

獲取組件間的水平間距

publicintgetVgap()

獲取組件間的垂直間距

publicvoidsetRows(int

rows)

將布局中的行數(shù)設(shè)置為指定值

publicvoidsetColumns(int

cols)

將布局中的列數(shù)設(shè)置為指定值

publicvoidsetHgap(int

hgap)將組件之間的水平間距設(shè)置為指定值。

publicvoidsetVgap(int

vgap)將組件之間的垂直間距設(shè)置為指定值。importjava.awt.*;importjavax.swing.*;classWindowGridextendsJFrame{JButtonb1,b2,b3,b4,b5,b6;publicWindowGrid(Strings){super(s);

GridLayoutgridLayout=newGridLayout(3,2);

gridLayout.setHgap(4);

gridLayout.setVgap(8);

setLayout(gridLayout);b1=newJButton("1");b2=newJButton("2");b3=newJButton("3");b4=newJButton("4");b5=newJButton("5");b6=newJButton("6");add(b1);add(b2);add(b3);add(b4);add(b5);add(b6);setBounds(100,100,600,300);setVisible(true);validate();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}}publicclassGridLayoutExp{publicstaticvoidmain(String[]args){WindowGridwin=newWindowGrid("GridLayout窗口");}}BoxLayout布局盒式容器的默認(rèn)布局是盒式布局且不允許更改使用javax.swing包中的Box類及其子類創(chuàng)建的容器稱為盒式容器布局方式使用盒式布局的容器將組件排列在一行或一列

行型盒式布局將組件排列在一行,組件按加入的先后順序從左至右排列,組件上沿在同一水平線上

列型盒式布局將組件排列在一列,組件按加入的先后順序從上至下排列,組件左沿在同一垂直線上

java.awt.Component

java.awt.Container

javax.swing.JComponent

javax.swing.Box常用方法

publicBoxLayout(Container

target,int

axis)創(chuàng)建一個(gè)將沿給定軸放置組件的布局管理器。

BoxLayout.X_AXIS組件從左到右放置BoxLayout.Y_AXIS組件從上到下放置BoxLayout.Line_AXIS根據(jù)目標(biāo)容器的ComponentOrientation屬性確定的文本行方向放置組件BoxLayout.Page_AXIS根據(jù)目標(biāo)容器的ComponentOrientation屬性確定的文本行在頁面中的流向來放置組件Box類的常用方法Box類是使用BoxLayout的輕量級(jí)容器在javax.swing包中

publicBox(int

axis)

創(chuàng)建一個(gè)沿指定坐標(biāo)軸顯示其組件的Box

publicstaticBoxcreateVerticalBox()創(chuàng)建一個(gè)從上到下顯示其組件的BoxpublicstaticBoxcreateHorizontalBox()創(chuàng)建一個(gè)從左到右顯示其組件的Box

publicstaticComponentcreateHorizontalStrut(int

width)創(chuàng)建一個(gè)不可見的、固定寬度的組件(水平支撐組件)??煽刂平M件間的水平間距。publicstaticComponentcreateVerticalStrut(int

height)創(chuàng)建一個(gè)不可見的、固定高度的組件(垂直支撐組件)??煽刂平M件間的垂直間距。importjava.awt.*;importjavax.swing.*;classWindowBoxextendsJFrame{BoxbaseBox,box1,box2;WindowBox(Strings){super(s);

box1=Box.createVerticalBox();box1.add(newJLabel("輸入您的姓名"));

box1.add(Box.createVerticalStrut(8));box1.add(newJLabel("輸入您的職業(yè)"));

box2=Box.createVerticalBox();box2.add(newJTextField(16));

box2.add(Box.createVerticalStrut(8));box2.add(newJTextField(16));

baseBox=Box.createHorizontalBox();baseBox.add(box1);

baseBox.add(Box.createHorizontalStrut(10));baseBox.add(box2);setLayout(newFlowLayout());add(baseBox);setBounds(100,100,400,150);setVisible(true);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}publicclassBoxLayoutExp{publicstaticvoidmain(String[]args){newWindowBox("BoxLayout窗口");}}GridBagLayout布局布局方式提供具有不同大小的行和列放置組件,每個(gè)單元可有不同的大小維持一個(gè)動(dòng)態(tài)的矩形單元網(wǎng)格,每個(gè)組件占用一個(gè)或多個(gè)這樣的單元每個(gè)由GridBagLayout管理的組件都與GridBagConstraints的實(shí)例相關(guān)聯(lián)。網(wǎng)格的總體方向取決于容器的ComponentOrientation屬性。水平自左向右:網(wǎng)格坐標(biāo)(0,0)位于容器的左上角,其中X向右遞增,Y向下遞增水平自右向左:網(wǎng)格坐標(biāo)(0,0)位于容器的右上角,其中X向左遞增,Y向下遞增

GridBagConstraints的成員gridx、gridy指定組件左上角在網(wǎng)格中的行與列容器中最左邊列的gridx=0,最右邊列的gridy=0GridBagConstraints.RELATIVE表示對(duì)應(yīng)的組件將放在前面放置組件的右邊或下面gridwidth、gridheight組件的橫向/縱向?qū)挾?,即組件占用的列數(shù)/行數(shù)使用GridBagConstraints.REMAINDER指定組件的顯示區(qū)域,該區(qū)域的范圍是從gridx/gridy到該行/列中的最后一個(gè)單元使用GridBagConstraints.RELATIVE指定組件的顯示區(qū)域,該區(qū)域的范圍是從gridx/gridy到其所在行/列的倒數(shù)第二個(gè)單元

fill

當(dāng)顯示區(qū)域比組件的區(qū)域大時(shí),可以用來控制組件的行為。GradBagConstraints.NONE默認(rèn)GradBagConstraints.HORIZONTAL組件橫向充滿顯示區(qū)域,但不改變組件高度GradBagConstraints.VERTICAL組件縱向充滿顯示區(qū)域,但不改變組件寬度GradBagConstraints.BOTH組件橫縱向充滿其顯示區(qū)域ipadx、ipady

指定布局中組件的內(nèi)部填充,是組件最小大小在橫向/縱向方向的添加量。當(dāng)fill取BOTH時(shí)不起作用。

insets

指定組件的外部填充,即組件間的間隙及組件與其顯示網(wǎng)格邊緣之間間距的最小量默認(rèn)組件沒有外部填充anchor當(dāng)組件小于顯示區(qū)域時(shí),告訴布局管理器組件在顯示區(qū)域中的位置

絕對(duì)值NORTH、SOUTH、WEST、EAST、NORTHWEST、NORTHEAST、SOUTHWEST、SOUTHEAST、CENTER(默認(rèn))相對(duì)于方向的值PAGE_START、PAGE_END、LINE_START、LINE_END、FIRST_LINE_START、FIRST_LINE_END、LAST_LINE_START、LAST_LINE_END相對(duì)于基線的值BASELINE、BASELINE_LEADING、BASELINE_TRAILING、ABOVE_BASELINE、ABOVE_BASELINE_LEADING、ABOVE_BASELINE_TRAILING、BELOW_BASELINE、BELOW_BASELINE_LEADING和BELOW_BASELINE_TRAILINGweightx、weighty行/列的權(quán)重,告訴布局管理器在容器大小改變時(shí),增加或減少的空間如何在組件間分配默認(rèn)值是0,即所有的組件將聚攏在容器中心,多余的空間將放在容器邊緣與網(wǎng)格單元之間除非在行(weighty)和列(weightx)中至少指定一個(gè)組件的權(quán)重,否則所有組件都會(huì)聚集在其容器的中央。若組件橫跨多列,將weightx設(shè)置為0;若組件縱跨多行,將weighty設(shè)置為0一行的權(quán)重為該行中組件的weighty的最大值一列的權(quán)重為該列中組件的weightx的最大值weightx,weighty取值一般在0與1之間常用方法

publicGridBagConstraints()publicvoidsetConstraints(Component

comp,GridBagConstraintsconstraints)(GridBagLayout類)publicvoidadd(Component

comp,Objectconstraints)(java.awt.Container類)btn1btn2btn3btn4btn5btn6insets:(10,20,30,40)gridx:012012gridy:000111gridwidth:11REMAINDER

1RELATIVE

REMAINDERgridheight:111222weightx:102030000weighty:101010202020fill:VERTICALBOTHBOTHBOTHBOTHNONEipadx:510ipady:15anchor:CENTER

LAST_LINE_ENDnull布局當(dāng)處理一些手工繪圖時(shí),需要自己來設(shè)置圖形的位置,不需要使用系統(tǒng)提供的布局管理器,可使用無布局管理器組件調(diào)用setBounds(inta,intb,intwidth,intheight)方法設(shè)置組件在容器中的位置和大小聯(lián)合布局GridBagLayoutBoxLayoutFlowLayout事件處理事件處理原理事件源組件對(duì)象名.addActionListener(監(jiān)聽者)監(jiān)聽者事件實(shí)現(xiàn)ActionListener接口publicvoidactionPerformed(ActionEvente)ActionEvent觸發(fā)注冊(cè)參數(shù)傳遞事件處理事件處理機(jī)制事件分類事件監(jiān)聽器事件適配器靈活設(shè)計(jì)事件監(jiān)聽器類用匿名內(nèi)置類實(shí)現(xiàn)事件監(jiān)聽器事件處理的多重運(yùn)用修改組件的默認(rèn)事件處理方式事件處理機(jī)制三個(gè)重要的概念事件:用戶對(duì)組件的一個(gè)操作,稱為一個(gè)事件事件源:發(fā)生事件的組件事件處理器:某個(gè)Java類中負(fù)責(zé)處理處理事件的成員方法,該方法接收一個(gè)事件對(duì)象,對(duì)其進(jìn)行解釋,并作出相應(yīng)處理事件源、事件、事件處理器之間的工作關(guān)系:組件(事件源)事件處理器事件監(jiān)聽器注冊(cè)事件對(duì)象生成事件對(duì)象外部作用把事件對(duì)象傳入事件處理器事件處理采用基于層次模型的向上傳遞機(jī)制當(dāng)事件發(fā)生時(shí),首先發(fā)送給產(chǎn)生事件的組件,如果該組件不對(duì)事件進(jìn)行處理,則事件將自動(dòng)傳遞到包含組件的容器事件將沿著組件間的包含關(guān)系層層向上傳遞事件監(jiān)聽器一個(gè)事件監(jiān)聽器對(duì)象負(fù)責(zé)處理一類事件一類事件的每一種發(fā)生情況,分別由事件監(jiān)聽器對(duì)象中的一個(gè)方法進(jìn)行處理在事件源和事件監(jiān)聽器對(duì)象中進(jìn)行約定的接口類,被稱為事件監(jiān)聽器接口

Java中每類事件都定義了一個(gè)相應(yīng)的監(jiān)聽器接口,該接口中實(shí)現(xiàn)了事件處理方法事件監(jiān)聽器接口類的名稱與事件類的名稱是相對(duì)應(yīng)的,比如MouseEvent的事件類的監(jiān)聽器接口名是MouseListener事件監(jiān)聽器接口Java提供了抽象的響應(yīng)特定事件的”事件監(jiān)聽器”,在java.awt.event包中定義為接口這些接口都由

java.util.EventListener接口繼承而來事件源注冊(cè)的事件監(jiān)聽者必須實(shí)現(xiàn)相應(yīng)接口中的抽象方法,以進(jìn)行事件處理一個(gè)事件監(jiān)聽者若要處理多種事件,就必須要實(shí)現(xiàn)多個(gè)事件接口。處理發(fā)生在某個(gè)GUI組件上的XXXEvent事件的某種情況,其事件處理的通用編寫流程:編寫一個(gè)實(shí)現(xiàn)了XXXListener接口的事件監(jiān)聽器類publicclassMyClassimplementsActionListener{……}XXXListener類中的用于處理該事件情況的方法中,編寫處理代碼publicclassMyClassimplementsActionListener{……publicvoidactionPerformed(ActionEvente){……}……}調(diào)用組件的addXXXListener方法,將類XXXListener創(chuàng)建的實(shí)例對(duì)象注冊(cè)到GUI組件上someComponent.AddActionListener(newMyClass());publicvoidaddActionListener(

ActionListener

l)l可以引用任何實(shí)現(xiàn)了該接口的類所創(chuàng)建的對(duì)象,當(dāng)事件源發(fā)生事件時(shí),接口l立刻回調(diào)被類實(shí)現(xiàn)的接口中的某個(gè)方法,即采用接口回調(diào)技術(shù)事件處理的多重運(yùn)用一個(gè)組件上的一個(gè)動(dòng)作可以產(chǎn)生多種不同類型的事件組件(事件源)外部作用事件對(duì)象1事件對(duì)象2事件處理器1事件處理器2……一個(gè)事件監(jiān)聽器對(duì)象可以注冊(cè)到多個(gè)事件源上組件1(事件源1)外部作用事件對(duì)象事件處理器…組件2(事件源2)在一個(gè)事件源上也可以注冊(cè)對(duì)同一類事件進(jìn)行處理的多個(gè)事件監(jiān)聽器對(duì)象組件(事件源)外部作用事件對(duì)象事件處理器1…事件處理器2這些事件處理方法的調(diào)用順序系統(tǒng)是沒有定義的適配器類JDK中提供了大多數(shù)事件監(jiān)聽器接口的最簡(jiǎn)單的實(shí)現(xiàn)類,稱為事件適配器類

事件監(jiān)聽器所在的類可以用適配器類作為父類,覆蓋要實(shí)現(xiàn)的方法,其余未實(shí)現(xiàn)的方法采用適配器類中的默認(rèn)方式實(shí)現(xiàn)事件監(jiān)聽器所在的類可作為獨(dú)立類,也可作為組件所在類的內(nèi)部類或匿名內(nèi)部類用事件適配器來處理事件,可以簡(jiǎn)化事件監(jiān)聽器的編寫事件適配器的不足如果事件監(jiān)聽器類已繼承其他類,就不能再繼承事件適配器類可以采用內(nèi)部類和匿名內(nèi)部類解決該問題如果監(jiān)聽器接口中只有一個(gè)方法,那么JDK沒必要為它形成一個(gè)適配器事件處理的幾種方法組件所在的類實(shí)現(xiàn)接口,用本類對(duì)象作為事件監(jiān)聽器classWinextendsJFrameimplementsActionListener{JButtonbtn;Win(){btn=newButton(“button”);

btn.addActionListener(this);…………}

publicvoidactionPerformed(ActionEvente){……}}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}

用組件所在類(設(shè)為類A)之外的類(設(shè)為類B)對(duì)象作為事件監(jiān)聽器,類B實(shí)現(xiàn)事件監(jiān)聽接口classWinextendsJFrame{JButtonbtn;

privateActionEventHandleractListener;Win(){btn=newButton(“button”);actListener=newActionEventHandler();

btn.addActionListener(actListener);…………}…………}classActionEventHandlerimplementsActionListener{

publicvoidactionPerformed(ActionEvente){……}}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}classWinextendsJFrame{privateWindowCloserwndListener;Win(){wndListener=newWindowCloser();

addWindowListener(wndListener);…………}…………}classWindowCloserextendsWindowAdapter{

publicvoidwindowClosing(WindowEvente){System.exit(0);}}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}單獨(dú)類classWinextendsJFrame{

privateclassInnerWindowCloserextends

WindowAdapter{

publicvoidwindowClosing(WindowEvente)

{System.exit(0);}}Win(){addWindowListener(newInnerWindowCloser());…………}…………}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}有名內(nèi)部類classWinextendsJFrame{Win(){addWindowListener(newWindowAdapter()

{publicvoidwindowClosing(WindowEvente){System.exit(0);}});

…………}…………}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}匿名內(nèi)部類事件分類按產(chǎn)生事件的物理操作和GUI組件的表現(xiàn)效果進(jìn)行分類MouseEventWindowEventActionEvent……事件類型在javax.swing.event中出現(xiàn)了一些新的swing組件事件類型TextEvent事件事件源:TextComponent、TextArea、TextField常量Text_VALUE_CHANGED

表示文本發(fā)生改變

KeyEvent事件

在InputEvent類中

publicbooleanisControlDown()publicbooleanisShiftDown()publicbooleanisMetaDown()publicbooleanisAltDown()判斷某個(gè)特定修飾符是否被按下publicintgetModifiers()返回修飾符KeyEvent類定義KEY_PRESSED、KEY_RELEASED、KEY_TYPED事件

publicintgetKeyCode()

返回按鍵的Unicode碼publicchargetKeyChar()

返回按鍵對(duì)應(yīng)的字符

publicstaticStringgetKeyText(int

keyCode)返回對(duì)按鍵描述的字符串

publicstaticStringgetKeyModifiersText(int

modifiers)

返回對(duì)修飾符描述的字符串處理復(fù)合鍵

e.getModifiers()==InputEvent.CTRL_MASK&&e.getKeyCode()==KeyEvent.VK_XInputEvent

SHIFT_MASKCTRL_MASKMETA_MASKALT_MASKALT_GRAPH_MASKBUTTON1_MASKBUTTON2_MASKBUTTON3_MASK復(fù)合鍵示例在窗口中放一個(gè)紅色按鈕按下shift+X,按鈕向右下方向各移動(dòng)100按下ctrl+X,按鈕的長(zhǎng)和寬各增加30setLayout(newFlowLayout());b=newJButton("button");b.setBackground(Color.red);

b.addKeyListener(this);add(b);publicvoidkeyPressed(KeyEvente){…………if(e.getModifiers()==InputEvent.SHIFT_MASK&&e.getKeyCode()==KeyEvent.VK_X){ b.setLocation(x+100,y+100);}elseif(e.getModifiers()==InputEvent.CTRL_MASK&&e.getKeyCode()==KeyEvent.VK_X){ b.setSize(w+30,h+30);}}MouseEvent事件常量定義

MOUSE_CLICKED按動(dòng)鼠標(biāo)按鍵

MOUSE_PRESSED按下鼠標(biāo)按鍵

MOUSE_RELEASED釋放鼠標(biāo)按鍵

MOUSE_MOVED移動(dòng)鼠標(biāo)

MOUSE_ENTERED鼠標(biāo)移入組件

MOUSE_EXITED鼠標(biāo)離開組件

MOUSE_DRAGGED拖動(dòng)鼠標(biāo)常用方法

publicintgetX()

publicintgetY()publicPointgetPoint()publicintgetClickCount()鼠標(biāo)事件示例在窗口上添加一個(gè)按鈕和帶滾動(dòng)條的文本區(qū)在按鈕上按下鼠標(biāo),在文本區(qū)中顯示按下點(diǎn)的坐標(biāo)在按鈕上釋放鼠標(biāo),在文本區(qū)中顯示釋放點(diǎn)的坐標(biāo)鼠標(biāo)進(jìn)入和退出按鈕時(shí),在文本區(qū)中顯示相應(yīng)信息拖動(dòng)按鈕和移動(dòng)鼠標(biāo)時(shí),在文本區(qū)中顯示相應(yīng)信息在按鈕上點(diǎn)擊鼠標(biāo),在文本區(qū)中顯示點(diǎn)擊位置的坐標(biāo),用右鍵還是左鍵點(diǎn)擊,點(diǎn)擊次數(shù)btn.addMouseListener(this);btn.addMouseMotionListener(this);publicvoidmousePressed(MouseEvente){ text.append("\nmousepressedat"+e.getX()+","+e.getY());}publicvoidmouseEntered(MouseEvente){ text.append("\nmouseentered!");}publicvoidmouseClicked(MouseEvente){ text.append("\nmouseclickedat"+e.getX()+","+e.getY()); if(e.getClickCount()>=2) text.append("\nclicked"+e.getClickCount()+"times"); if(e.getModifiers()==e.BUTTON1_MASK) text.append("\nleftbuttonclicked!"); elseif(e.getModifiers()==e.BUTTON3_MASK) text.append("\nrightbuttonclicked!"); }FocusEvent事件焦點(diǎn)的永久變化:焦點(diǎn)從一個(gè)組件直接移動(dòng)到另一個(gè)部件

publicvoidrequestFocus()java.awt.Component

焦點(diǎn)的暫時(shí)變化:對(duì)組件進(jìn)行非直接操作【作業(yè)】利用鼠標(biāo)進(jìn)行繪圖點(diǎn)擊窗口中的空白處,得到一張“笑臉”的圖像;點(diǎn)擊已存在的圖像,圖像在“笑臉”和“哭臉”之間切換;用鼠標(biāo)可以對(duì)圖像進(jìn)行拖動(dòng)操作;在窗口左上角,顯示當(dāng)前鼠標(biāo)光標(biāo)的位置運(yùn)行結(jié)果如下:焦點(diǎn)事件示例在窗口上放三個(gè)長(zhǎng)度為7的文本框當(dāng)一個(gè)文本框輸入滿后,焦點(diǎn)自動(dòng)轉(zhuǎn)移到下一個(gè)文本框獲得焦點(diǎn)的文本框自動(dòng)清空for(inti=0;i<3;i++){text[i]=newTextField(7);

text[i].addKeyListener(this);

text[i].addFocusListener(this);add(text[i]);}

text[0].requestFocusInWindow();/*如果此Component的頂層祖先已經(jīng)是獲得焦點(diǎn)的Window,則請(qǐng)求此Component獲取輸入焦點(diǎn)*/publicvoidfocusGained(FocusEvente){TextFieldtext=(TextField)e.getSource();text.setText(null);}

publicvoidkeyPressed(KeyEvente){TextFieldt=(TextField)e.getSource();if(t.getCaretPosition(

)>=6)//返回文本插入符的位置

t.transferFocus();//將焦點(diǎn)轉(zhuǎn)移到下一個(gè)組件}WindowEvent事件WindowListener接口publicvoidwindowActivated(WindowEvente)窗口從非激活狀態(tài)到激活狀態(tài)時(shí)publicvoidwindowDeactivated(WindowEvente)窗口從激活狀態(tài)到非激活狀態(tài)時(shí)publicvoidwindowClosing(WindowEvente)窗口正在被關(guān)閉publicvoidwindowClosed(WindowEvente)窗口關(guān)閉時(shí)publicvoidwindowIconified(WindowEvente)窗口圖標(biāo)化時(shí)publicvoidwindowDeiconified(WindowEvente)窗口撤銷圖標(biāo)化時(shí)publicvoidwindowOpened(WindowEvente)窗口打開時(shí)單擊窗口右上角的圖標(biāo)化按鈕

windowIconified()windowDeactivated()撤消窗口圖標(biāo)化

windowDeiconified()windowActivated()單擊窗口的關(guān)閉圖標(biāo)

windowClosing()(調(diào)用dispose()方法)執(zhí)行窗口初始化時(shí)用setDefaultCloseOperation(intn)設(shè)定的關(guān)閉操作執(zhí)行windowClosed()若在windowClosing()中執(zhí)行了System.exit(0)或setDefaultCloseOperation設(shè)定的關(guān)閉操作是EXIT_ON_CLOSE或DO_NOTHING_ON_CLOSE,則監(jiān)視器沒有機(jī)會(huì)調(diào)用windowClosed()方法窗口事件示例在窗口中添加一個(gè)帶滾動(dòng)條的文本區(qū)窗口打開、被激活、未激活、圖標(biāo)化和未圖標(biāo)化時(shí)在文本區(qū)中顯示相應(yīng)信息窗口正被關(guān)閉及已關(guān)閉,在控制臺(tái)輸出相應(yīng)信息publicvoidwindowActivated(WindowEvente){ta.append("窗口被激活\n");}publicvoidwindowDeactivated(WindowEvente){ta.append("窗口未被激活\n");}publicvoidwindowOpened(WindowEvente){ ta.append("窗口被打開");} publicvoidwindowIconified(WindowEvente){ta.append("窗口被圖標(biāo)化\n");} publicvoidwindowDeiconified(WindowEvente){ta.append("窗口未被圖標(biāo)化\n");}publicvoidwindowClosing(WindowEvente){System.out.println("窗口正在關(guān)閉\n");}publicvoidwindowClosed(WindowEvente){System.out.println("窗口已被關(guān)閉\n");}publicWin(){ta=newJTextArea();add(newJScrollPane(ta),BorderLayout.CENTER);addWindowListener(this); setVisible(true);setSize(300,400);setDefaultCloseOperation(DISPOSE_ON_CLOSE);validate(); }自定義事件AWTEventMulticasterjava.awt事件源可注冊(cè)多個(gè)監(jiān)聽器,此類管理一個(gè)由

事件監(jiān)聽器鏈構(gòu)成的結(jié)構(gòu),將事件發(fā)送到所有的監(jiān)聽器此類實(shí)現(xiàn)了所有事件監(jiān)聽接口,并包含方法publicstaticXXXListeneradd(XXXListenerlis,XXXListenernewListener)將newListener添加到lis上并返回組合的監(jiān)聽器publicstaticXXXListenerremove(XXXListenerlis,XXXListeneroldListener)把oldListener從lis上移走并返回削減的監(jiān)聽器publicmyComponentextendsComponent{ActionListeneractionListener=null;publicsynchronizedvoidaddActionListener(ActionListenerl){actionListener=AWTEventMulticaster.add(actionListener,l);}publicsynchronizedvoidremoveActionListener(ActionListenerl){actionListener=AWTEventMulticaster.remove(actionListener,l);}publicvoidprocessEvent(AWTEvente){ActionListenerlistener=actionListener;if(listener!=null){listener.actionPerformed(newActionEvent());}}}

添加監(jiān)聽器移走監(jiān)聽器自定義組件類創(chuàng)建事件調(diào)用監(jiān)聽器中的事件處理方法自定義事件示例點(diǎn)擊start開始計(jì)數(shù),計(jì)數(shù)完畢產(chǎn)生一個(gè)自定義事件該自定義事件傳遞給自定義組件的事件偵聽者,并在文本框中輸出信息指出事件源classCountDown{ActionListenerlistener=null;Objectsource=null;intmaxCount=10;publicCountDown(Objects,intm){ source=s; maxCount=m;}

publicvoidaddActionListener(ActionListenernewListener){listener=AWTEventMulticaster.add(listener,newListener);}publicvoidremoveActionListener(ActionListeneroldListener){listener=AWTEventMulticaster.remove(listener,oldListener);}publicvoidstartCounting(){ if(listener!=null) {for(inti=maxCount;i>=0;i--) System.out.println("i:"+i); System.out.println("Done.Generatingeventnow...");

listener.actionPerformed(newActionEvent(source,ActionEvent.ACTION_PERFORMED,"CountDown")); }}publicvoidactionPerformed(ActionEvente){if(e.getSource()==start)

count.startCounting();elseif(e.getSource()==show) display.setText("Eventcamefrom:"+e.getActionCommand());}startStart觸發(fā)ActionEvent事件actionPerformed監(jiān)聽器countstartCountingActionEvent事件”CountDown”創(chuàng)建注冊(cè)注冊(cè)修改事件的默認(rèn)處理方式只有在一個(gè)組件上注冊(cè)了某種事件的事件監(jiān)聽器對(duì)象后,組件才會(huì)產(chǎn)生相應(yīng)的事件對(duì)象默認(rèn)的processEvent方法調(diào)用相應(yīng)的processXXXEvent方法調(diào)用enableEvents(long)方法,可以在即使沒有注冊(cè)事件監(jiān)聽器的情況下,組件也能夠?qū)δ承╊愋偷氖录M(jìn)行響應(yīng)和產(chǎn)生相應(yīng)的事件對(duì)象Canvas是具有最基本和最簡(jiǎn)單的GUI功能的組件Canvas代表屏幕上的一塊空白的矩形區(qū)域,程序能夠在這個(gè)部件表面繪圖,也能夠捕獲用戶的操作,產(chǎn)生相應(yīng)的事件當(dāng)要設(shè)計(jì)自定制的具有GUI功能的組件類時(shí),繼承Canvas將會(huì)大大簡(jiǎn)化編程難度編程實(shí)例:設(shè)計(jì)一個(gè)自定制的計(jì)時(shí)器組件,當(dāng)鼠標(biāo)在計(jì)時(shí)器組件上按下時(shí),計(jì)時(shí)器開始計(jì)時(shí),并顯示計(jì)時(shí)時(shí)間;當(dāng)鼠標(biāo)釋放時(shí),計(jì)時(shí)器停止計(jì)時(shí)GUI組件文本組件JTextField、JTextArea、JPasswordFieldJTextField

文本框允許用戶輸入單行文本常用函數(shù)

publicvoidaddActionListener(ActionListener

l)publicvoidremoveActionListener(ActionListener

l)publicJTextField(String

text)publicJTextField()publicJTextField(int

columns)publicStringgetText()

javax.swing.text.JTextComponentpublicvoidsetText(String

t)javax.swing.text.JTextComponent

publicvoidsetEditable(boolean

b)publicvoidsetHorizontalAlignment(int

alignment)

JTextField.LEFTJTextField.CENTERJTextField.RIGHTJTextField.LEADINGJTextField.TRAILING

在文本框中輸入文本后,按下Enter觸發(fā)ActionEvent事件ActionEvent事件事件源:Button、TextField、List、MenuItem

常量ACTION_PERFORMED是事件的識(shí)別碼常量SHIFT_MASK、CTRL_MASK、ALT_MASK、META_MASK

表示事件發(fā)生時(shí)同時(shí)按下的鍵

publicStringgetActionCommand()

返回與此動(dòng)作相關(guān)的命令字符串。如Button的命令字是按鈕的標(biāo)簽,List的命令字是選擇項(xiàng),TextField的命令字是輸入字符串文本框上的文檔類型

publicJTextField(Document

doc,String

text,int

columns)用指定的文檔document創(chuàng)建一個(gè)文本框,文本框的默認(rèn)文檔類型是PlainDocumentjavax.swing.text.AbstractDocument

javax.swing.text.PlainDocument

PlainDocument類的重要方法

insertString(intoffset,Strings,AttributeSeta)在文本框中進(jìn)行字符輸入操作時(shí),自動(dòng)執(zhí)行publicvoidremove(int

offs,int

len)

在文本框中進(jìn)行字符刪除操作時(shí),自動(dòng)執(zhí)行

javax.swing.text.AbstractDocumentpublicvoidsetDocument(Document

doc)javax.swing.JTextField

改變文本框的文檔類型

JPasswordField

javax.swing.JTextField

javax.swing.JPasswordField默認(rèn)回顯字符是‘*’常用函數(shù)

publicvoidsetEchoChar(char

c)publicchargetEchoChar()publicchar[]getPassword()

可以觸發(fā)ActionEvent事件

字體:粗斜

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論