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

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論