版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java的圖形用戶(hù)界面java.awt包與javax.swing包java.awt包稱(chēng)為抽象窗口工具集AWT(AbstractWindowToolkit),是使用Java進(jìn)行GUI設(shè)計(jì)的基礎(chǔ)功能
用戶(hù)界面組件事件處理模型圖形和圖像工具布局管理器程序的GUI部分由AWT線(xiàn)程管理在特定平臺(tái)上,每個(gè)AWT組件對(duì)象都有一個(gè)控制該對(duì)象外觀(guān)顯示的本地對(duì)等組件對(duì)象ButtonButtonPeerWindowsButtonPeerMotifButtonPeerMacOsButtonPeer平臺(tái)無(wú)關(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類(lèi)的直接子類(lèi)和間接子類(lèi)。
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í)組件代碼依賴(lài)于底層操作系統(tǒng),并且存在一個(gè)對(duì)等組件做對(duì)應(yīng),將事件傳遞給對(duì)等組件處理。AWT組件是重量級(jí)的輕量級(jí)組件
沒(méi)有本地代碼,不依賴(lài)操作系統(tǒng)的支持具有平臺(tái)獨(dú)立的API并且有平臺(tái)獨(dú)立的實(shí)現(xiàn)Swing組件是輕量級(jí)的Swing組件以J開(kāi)頭增加了一個(gè)豐富的高層組件集合,如表格(JTable)、樹(shù)(JTree)。
在Swing中,JFrame,JDialog,JWindow,JApplet這四個(gè)組件被稱(chēng)為重量級(jí)組件(頂層容器),它們必須使用本地代碼來(lái)顯示窗口畫(huà)面。Swing組件不能直接添加到頂層容器中,必須添加到一個(gè)與Swing頂層容器相關(guān)聯(lián)的內(nèi)容面板(contentpane)上。publicContainergetContentPane()內(nèi)容面板是頂層容器包含的一個(gè)普通容器,它是一個(gè)輕量級(jí)組件。一個(gè)簡(jiǎn)單的圖形用戶(hù)界面程序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)布局布局方式組件按加入的先后順序從左到右排列通過(guò)設(shè)置componentOrientation屬性改變流的方向LEFT_TO_RIGHTRIGHT_TO_LEFTUNKNOWN一行排滿(mǎn)后自動(dòng)換行每一行中的組件都居中排列每一個(gè)組件的大小為默認(rèn)的最佳大小組件間的默認(rèn)水平和垂直間隙是5個(gè)像素常用方法
publicvoidsetPreferredSize(Dimension)
java.awt.Component
組件改變最佳大小的函數(shù)組件調(diào)用setSize(intx,inty)設(shè)置的大小無(wú)效
publicvoidsetAlignment(int
align)
重新設(shè)置布局的對(duì)齊方式FlowLayout.LEFT
FlowLayout.RIGHTFlowLayout.CENTER
FlowLayout.LEADING
FlowLayout.TRAILING每一行組件沿容器方向的開(kāi)始邊界對(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)用戶(hù)改變?nèi)萜鞔翱诖笮r(shí),各個(gè)組件的相對(duì)位置不變,而組件大小改變常用方法publicBorderLayout()
構(gòu)造一個(gè)組件之間沒(méi)有間距的新邊框布局。
publicBorderLayout(int
hgap,int
vgap)
構(gòu)造一個(gè)具有指定組件間距的邊框布局。水平間距由hgap指定,垂直間距由vgap指定。
publicvoidadd(Componentcomp,Objectconstraints)java.awt.Container
將指定的組件添加到此容器的尾部。同時(shí)通知布局管理器使用指定的constraints對(duì)象將組件添加到此容器的布局中。publicComponentadd(Stringname,Componentcomp)在BorderLayout類(lèi)中,定義了表示方位的5個(gè)publicstaticfinalString類(lèi)型的常量: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類(lèi)及其子類(lèi)創(chuàng)建的容器稱(chēng)為盒式容器布局方式使用盒式布局的容器將組件排列在一行或一列
行型盒式布局將組件排列在一行,組件按加入的先后順序從左至右排列,組件上沿在同一水平線(xiàn)上
列型盒式布局將組件排列在一列,組件按加入的先后順序從上至下排列,組件左沿在同一垂直線(xiàn)上
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屬性確定的文本行在頁(yè)面中的流向來(lái)放置組件Box類(lèi)的常用方法Box類(lèi)是使用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è)不可見(jiàn)的、固定寬度的組件(水平支撐組件)??煽刂平M件間的水平間距。publicstaticComponentcreateVerticalStrut(int
height)創(chuàng)建一個(gè)不可見(jiàn)的、固定高度的組件(垂直支撐組件)。可控制組件間的垂直間距。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í),可以用來(lái)控制組件的行為。GradBagConstraints.NONE默認(rèn)GradBagConstraints.HORIZONTAL組件橫向充滿(mǎn)顯示區(qū)域,但不改變組件高度GradBagConstraints.VERTICAL組件縱向充滿(mǎn)顯示區(qū)域,但不改變組件寬度GradBagConstraints.BOTH組件橫縱向充滿(mǎn)其顯示區(qū)域ipadx、ipady
指定布局中組件的內(nèi)部填充,是組件最小大小在橫向/縱向方向的添加量。當(dāng)fill取BOTH時(shí)不起作用。
insets
指定組件的外部填充,即組件間的間隙及組件與其顯示網(wǎng)格邊緣之間間距的最小量默認(rèn)組件沒(méi)有外部填充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ì)于基線(xiàn)的值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類(lèi))publicvoidadd(Component
comp,Objectconstraints)(java.awt.Container類(lèi))btn1btn2btn3btn4btn5btn6insets:(10,20,30,40)gridx:012012gridy:000111gridwidth:11REMAINDER
1RELATIVE
REMAINDERgridheight:111222weightx:102030000weighty:101010202020fill:VERTICALBOTHBOTHBOTHBOTHNONEipadx:510ipady:15anchor:CENTER
LAST_LINE_ENDnull布局當(dāng)處理一些手工繪圖時(shí),需要自己來(lái)設(shè)置圖形的位置,不需要使用系統(tǒng)提供的布局管理器,可使用無(wú)布局管理器組件調(diào)用setBounds(inta,intb,intwidth,intheight)方法設(shè)置組件在容器中的位置和大小聯(lián)合布局GridBagLayoutBoxLayoutFlowLayout事件處理事件處理原理事件源組件對(duì)象名.addActionListener(監(jiān)聽(tīng)者)監(jiān)聽(tīng)者事件實(shí)現(xiàn)ActionListener接口publicvoidactionPerformed(ActionEvente)ActionEvent觸發(fā)注冊(cè)參數(shù)傳遞事件處理事件處理機(jī)制事件分類(lèi)事件監(jiān)聽(tīng)器事件適配器靈活設(shè)計(jì)事件監(jiān)聽(tīng)器類(lèi)用匿名內(nèi)置類(lèi)實(shí)現(xiàn)事件監(jiān)聽(tīng)器事件處理的多重運(yùn)用修改組件的默認(rèn)事件處理方式事件處理機(jī)制三個(gè)重要的概念事件:用戶(hù)對(duì)組件的一個(gè)操作,稱(chēng)為一個(gè)事件事件源:發(fā)生事件的組件事件處理器:某個(gè)Java類(lèi)中負(fù)責(zé)處理處理事件的成員方法,該方法接收一個(gè)事件對(duì)象,對(duì)其進(jìn)行解釋?zhuān)⒆鞒鱿鄳?yīng)處理事件源、事件、事件處理器之間的工作關(guān)系:組件(事件源)事件處理器事件監(jiān)聽(tīng)器注冊(cè)事件對(duì)象生成事件對(duì)象外部作用把事件對(duì)象傳入事件處理器事件處理采用基于層次模型的向上傳遞機(jī)制當(dāng)事件發(fā)生時(shí),首先發(fā)送給產(chǎn)生事件的組件,如果該組件不對(duì)事件進(jìn)行處理,則事件將自動(dòng)傳遞到包含組件的容器事件將沿著組件間的包含關(guān)系層層向上傳遞事件監(jiān)聽(tīng)器一個(gè)事件監(jiān)聽(tīng)器對(duì)象負(fù)責(zé)處理一類(lèi)事件一類(lèi)事件的每一種發(fā)生情況,分別由事件監(jiān)聽(tīng)器對(duì)象中的一個(gè)方法進(jìn)行處理在事件源和事件監(jiān)聽(tīng)器對(duì)象中進(jìn)行約定的接口類(lèi),被稱(chēng)為事件監(jiān)聽(tīng)器接口
Java中每類(lèi)事件都定義了一個(gè)相應(yīng)的監(jiān)聽(tīng)器接口,該接口中實(shí)現(xiàn)了事件處理方法事件監(jiān)聽(tīng)器接口類(lèi)的名稱(chēng)與事件類(lèi)的名稱(chēng)是相對(duì)應(yīng)的,比如MouseEvent的事件類(lèi)的監(jiān)聽(tīng)器接口名是MouseListener事件監(jiān)聽(tīng)器接口Java提供了抽象的響應(yīng)特定事件的”事件監(jiān)聽(tīng)器”,在java.awt.event包中定義為接口這些接口都由
java.util.EventListener接口繼承而來(lái)事件源注冊(cè)的事件監(jiān)聽(tīng)者必須實(shí)現(xiàn)相應(yīng)接口中的抽象方法,以進(jìn)行事件處理一個(gè)事件監(jiān)聽(tīng)者若要處理多種事件,就必須要實(shí)現(xiàn)多個(gè)事件接口。處理發(fā)生在某個(gè)GUI組件上的XXXEvent事件的某種情況,其事件處理的通用編寫(xiě)流程:編寫(xiě)一個(gè)實(shí)現(xiàn)了XXXListener接口的事件監(jiān)聽(tīng)器類(lèi)publicclassMyClassimplementsActionListener{……}XXXListener類(lèi)中的用于處理該事件情況的方法中,編寫(xiě)處理代碼publicclassMyClassimplementsActionListener{……publicvoidactionPerformed(ActionEvente){……}……}調(diào)用組件的addXXXListener方法,將類(lèi)XXXListener創(chuàng)建的實(shí)例對(duì)象注冊(cè)到GUI組件上someComponent.AddActionListener(newMyClass());publicvoidaddActionListener(
ActionListener
l)l可以引用任何實(shí)現(xiàn)了該接口的類(lèi)所創(chuàng)建的對(duì)象,當(dāng)事件源發(fā)生事件時(shí),接口l立刻回調(diào)被類(lèi)實(shí)現(xiàn)的接口中的某個(gè)方法,即采用接口回調(diào)技術(shù)事件處理的多重運(yùn)用一個(gè)組件上的一個(gè)動(dòng)作可以產(chǎn)生多種不同類(lèi)型的事件組件(事件源)外部作用事件對(duì)象1事件對(duì)象2事件處理器1事件處理器2……一個(gè)事件監(jiān)聽(tīng)器對(duì)象可以注冊(cè)到多個(gè)事件源上組件1(事件源1)外部作用事件對(duì)象事件處理器…組件2(事件源2)在一個(gè)事件源上也可以注冊(cè)對(duì)同一類(lèi)事件進(jìn)行處理的多個(gè)事件監(jiān)聽(tīng)器對(duì)象組件(事件源)外部作用事件對(duì)象事件處理器1…事件處理器2這些事件處理方法的調(diào)用順序系統(tǒng)是沒(méi)有定義的適配器類(lèi)JDK中提供了大多數(shù)事件監(jiān)聽(tīng)器接口的最簡(jiǎn)單的實(shí)現(xiàn)類(lèi),稱(chēng)為事件適配器類(lèi)
事件監(jiān)聽(tīng)器所在的類(lèi)可以用適配器類(lèi)作為父類(lèi),覆蓋要實(shí)現(xiàn)的方法,其余未實(shí)現(xiàn)的方法采用適配器類(lèi)中的默認(rèn)方式實(shí)現(xiàn)事件監(jiān)聽(tīng)器所在的類(lèi)可作為獨(dú)立類(lèi),也可作為組件所在類(lèi)的內(nèi)部類(lèi)或匿名內(nèi)部類(lèi)用事件適配器來(lái)處理事件,可以簡(jiǎn)化事件監(jiān)聽(tīng)器的編寫(xiě)事件適配器的不足如果事件監(jiān)聽(tīng)器類(lèi)已繼承其他類(lèi),就不能再繼承事件適配器類(lèi)可以采用內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)解決該問(wèn)題如果監(jiān)聽(tīng)器接口中只有一個(gè)方法,那么JDK沒(méi)必要為它形成一個(gè)適配器事件處理的幾種方法組件所在的類(lèi)實(shí)現(xiàn)接口,用本類(lèi)對(duì)象作為事件監(jiān)聽(tīng)器classWinextendsJFrameimplementsActionListener{JButtonbtn;Win(){btn=newButton(“button”);
btn.addActionListener(this);…………}
publicvoidactionPerformed(ActionEvente){……}}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}
用組件所在類(lèi)(設(shè)為類(lèi)A)之外的類(lèi)(設(shè)為類(lèi)B)對(duì)象作為事件監(jiān)聽(tīng)器,類(lèi)B實(shí)現(xiàn)事件監(jiān)聽(tīng)接口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ú)類(lèi)classWinextendsJFrame{
privateclassInnerWindowCloserextends
WindowAdapter{
publicvoidwindowClosing(WindowEvente)
{System.exit(0);}}Win(){addWindowListener(newInnerWindowCloser());…………}…………}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}有名內(nèi)部類(lèi)classWinextendsJFrame{Win(){addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente){System.exit(0);}});
…………}…………}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}匿名內(nèi)部類(lèi)事件分類(lèi)按產(chǎn)生事件的物理操作和GUI組件的表現(xiàn)效果進(jìn)行分類(lèi)MouseEventWindowEventActionEvent……事件類(lèi)型在javax.swing.event中出現(xiàn)了一些新的swing組件事件類(lèi)型TextEvent事件事件源:TextComponent、TextArea、TextField常量Text_VALUE_CHANGED
表示文本發(fā)生改變
KeyEvent事件
在InputEvent類(lèi)中
publicbooleanisControlDown()publicbooleanisShiftDown()publicbooleanisMetaDown()publicbooleanisAltDown()判斷某個(gè)特定修飾符是否被按下publicintgetModifiers()返回修飾符KeyEvent類(lèi)定義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)離開(kāi)組件
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è)文本框輸入滿(mǎn)后,焦點(diǎn)自動(dòng)轉(zhuǎn)移到下一個(gè)文本框獲得焦點(diǎn)的文本框自動(dòng)清空f(shuō)or(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)窗口撤銷(xiāo)圖標(biāo)化時(shí)publicvoidwindowOpened(WindowEvente)窗口打開(kāi)時(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)視器沒(méi)有機(jī)會(huì)調(diào)用windowClosed()方法窗口事件示例在窗口中添加一個(gè)帶滾動(dòng)條的文本區(qū)窗口打開(kāi)、被激活、未激活、圖標(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("窗口被打開(kāi)");} 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)聽(tīng)器,此類(lèi)管理一個(gè)由
事件監(jiān)聽(tīng)器鏈構(gòu)成的結(jié)構(gòu),將事件發(fā)送到所有的監(jiān)聽(tīng)器此類(lèi)實(shí)現(xiàn)了所有事件監(jiān)聽(tīng)接口,并包含方法publicstaticXXXListeneradd(XXXListenerlis,XXXListenernewListener)將newListener添加到lis上并返回組合的監(jiān)聽(tīng)器publicstaticXXXListenerremove(XXXListenerlis,XXXListeneroldListener)把oldListener從lis上移走并返回削減的監(jiān)聽(tīng)器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)聽(tīng)器移走監(jiān)聽(tīng)器自定義組件類(lèi)創(chuàng)建事件調(diào)用監(jiān)聽(tīng)器中的事件處理方法自定義事件示例點(diǎn)擊start開(kāi)始計(jì)數(shù),計(jì)數(shù)完畢產(chǎn)生一個(gè)自定義事件該自定義事件傳遞給自定義組件的事件偵聽(tīng)者,并在文本框中輸出信息指出事件源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)聽(tīng)器countstartCountingActionEvent事件”CountDown”創(chuàng)建注冊(cè)注冊(cè)修改事件的默認(rèn)處理方式只有在一個(gè)組件上注冊(cè)了某種事件的事件監(jiān)聽(tīng)器對(duì)象后,組件才會(huì)產(chǎn)生相應(yīng)的事件對(duì)象默認(rèn)的processEvent方法調(diào)用相應(yīng)的processXXXEvent方法調(diào)用enableEvents(long)方法,可以在即使沒(méi)有注冊(cè)事件監(jiān)聽(tīng)器的情況下,組件也能夠?qū)δ承╊?lèi)型的事件進(jìn)行響應(yīng)和產(chǎn)生相應(yīng)的事件對(duì)象Canvas是具有最基本和最簡(jiǎn)單的GUI功能的組件Canvas代表屏幕上的一塊空白的矩形區(qū)域,程序能夠在這個(gè)部件表面繪圖,也能夠捕獲用戶(hù)的操作,產(chǎn)生相應(yīng)的事件當(dāng)要設(shè)計(jì)自定制的具有GUI功能的組件類(lèi)時(shí),繼承Canvas將會(huì)大大簡(jiǎn)化編程難度編程實(shí)例:設(shè)計(jì)一個(gè)自定制的計(jì)時(shí)器組件,當(dāng)鼠標(biāo)在計(jì)時(shí)器組件上按下時(shí),計(jì)時(shí)器開(kāi)始計(jì)時(shí),并顯示計(jì)時(shí)時(shí)間;當(dāng)鼠標(biāo)釋放時(shí),計(jì)時(shí)器停止計(jì)時(shí)GUI組件文本組件JTextField、JTextArea、JPasswordFieldJTextField
文本框允許用戶(hù)輸入單行文本常用函數(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的命令字是輸入字符串文本框上的文檔類(lèi)型
publicJTextField(Document
doc,String
text,int
columns)用指定的文檔document創(chuàng)建一個(gè)文本框,文本框的默認(rèn)文檔類(lèi)型是PlainDocumentjavax.swing.text.AbstractDocument
javax.swing.text.PlainDocument
PlainDocument類(lèi)的重要方法
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
改變文本框的文檔類(lèi)型
JPasswordField
javax.swing.JTextField
javax.swing.JPasswordField默認(rèn)回顯字符是‘*’常用函數(shù)
publicvoidsetEchoChar(char
c)publicchargetEchoChar()publicchar[]getPassword()
可以觸發(fā)ActionEvent事件
字體:粗斜
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園提升保教質(zhì)量教師案例
- 鐵路運(yùn)輸卸料平臺(tái)改進(jìn)方案
- 航空維修標(biāo)準(zhǔn)化作業(yè)方案
- 加氣站安全設(shè)施維護(hù)工作總結(jié)
- 活動(dòng)現(xiàn)場(chǎng)便攜發(fā)電機(jī)使用方案
- 2019年醫(yī)院“清廉醫(yī)療”服務(wù)提升方案
- 醫(yī)療機(jī)構(gòu)藥品采購(gòu)審批制度
- 沉井施工材料選擇方案
- 懷化學(xué)院《食品機(jī)械與設(shè)備》2023-2024學(xué)年第一學(xué)期期末試卷
- 懷化學(xué)院《模擬電子技術(shù)》2022-2023學(xué)年期末試卷
- 產(chǎn)品設(shè)計(jì)中材料選擇與開(kāi)發(fā)
- 工程結(jié)算匯總表及工程結(jié)算明細(xì)表(范本)
- 管線(xiàn)管廊布置設(shè)計(jì)規(guī)范
- 《會(huì)計(jì)平衡公式》教案
- 八年級(jí)黃金矩形(數(shù)學(xué)活動(dòng))ppt課件
- 銷(xiāo)售技巧個(gè)頂尖電梯銷(xiāo)售技巧
- 《幼兒園衛(wèi)生保健后勤材料資料》幼兒園保健醫(yī)生每日檢查工作記錄表
- 葡萄糖生產(chǎn)教程
- 需求價(jià)格彈性案例分析
- 企業(yè)內(nèi)部通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 計(jì)算機(jī)論文
- 重大決策合法性審查表.doc
評(píng)論
0/150
提交評(píng)論