




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Java的圖形用戶界面java.awt包與javax.swing包java.awt包稱為抽象窗口工具集AWT(AbstractWindowToolkit),是使用Java進行GUI設(shè)計的基礎(chǔ)功能
用戶界面組件事件處理模型圖形和圖像工具布局管理器程序的GUI部分由AWT線程管理在特定平臺上,每個AWT組件對象都有一個控制該對象外觀顯示的本地對等組件對象ButtonButtonPeerWindowsButtonPeerMotifButtonPeerMacOsButtonPeer平臺無關(guān)的API和實現(xiàn)特定于平臺的實現(xiàn)javax.swing包
幾乎所有AWT組件對應(yī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組件重量級組件代碼依賴于底層操作系統(tǒng),并且存在一個對等組件做對應(yīng),將事件傳遞給對等組件處理。AWT組件是重量級的輕量級組件
沒有本地代碼,不依賴操作系統(tǒng)的支持具有平臺獨立的API并且有平臺獨立的實現(xiàn)Swing組件是輕量級的Swing組件以J開頭增加了一個豐富的高層組件集合,如表格(JTable)、樹(JTree)。
在Swing中,JFrame,JDialog,JWindow,JApplet這四個組件被稱為重量級組件(頂層容器),它們必須使用本地代碼來顯示窗口畫面。Swing組件不能直接添加到頂層容器中,必須添加到一個與Swing頂層容器相關(guān)聯(lián)的內(nèi)容面板(contentpane)上。publicContainergetContentPane()內(nèi)容面板是頂層容器包含的一個普通容器,它是一個輕量級組件。一個簡單的圖形用戶界面程序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型容器的默認布局布局方式組件按加入的先后順序從左到右排列通過設(shè)置componentOrientation屬性改變流的方向LEFT_TO_RIGHTRIGHT_TO_LEFTUNKNOWN一行排滿后自動換行每一行中的組件都居中排列每一個組件的大小為默認的最佳大小組件間的默認水平和垂直間隙是5個像素常用方法
publicvoidsetPreferredSize(Dimension)
java.awt.Component
組件改變最佳大小的函數(shù)組件調(diào)用setSize(intx,inty)設(shè)置的大小無效
publicvoidsetAlignment(int
align)
重新設(shè)置布局的對齊方式FlowLayout.LEFT
FlowLayout.RIGHTFlowLayout.CENTER
FlowLayout.LEADING
FlowLayout.TRAILING每一行組件沿容器方向的開始邊界對齊每一行組件沿容器方向的結(jié)束邊界對齊常用方法
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)的默認布局布局方式容器空間劃分為東、西、南、北、中5個區(qū)域
CENTER(默認)NORTHSOUTHWESTEAST中間區(qū)域最大,添加組件時應(yīng)指明所添加的區(qū)域,且組件將占據(jù)整個區(qū)域至多添加5個組件當用戶改變?nèi)萜鞔翱诖笮r,各個組件的相對位置不變,而組件大小改變常用方法publicBorderLayout()
構(gòu)造一個組件之間沒有間距的新邊框布局。
publicBorderLayout(int
hgap,int
vgap)
構(gòu)造一個具有指定組件間距的邊框布局。水平間距由hgap指定,垂直間距由vgap指定。
publicvoidadd(Componentcomp,Objectconstraints)java.awt.Container
將指定的組件添加到此容器的尾部。同時通知布局管理器使用指定的constraints對象將組件添加到此容器的布局中。publicComponentadd(Stringname,Componentcomp)在BorderLayout類中,定義了表示方位的5個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布局布局方式可容納多個組件,組件被層疊放入容器中最先加入容器的組件位于最上層,依次向下排序每次只能顯示一個組件,被顯示組件占據(jù)所有的容器空間卡片通常為一個Panel對象當需要許多面板切換,而每個面板需要顯示為不同布局時,可以使用卡片布局常用方法
publicCardLayout()
創(chuàng)建一個間距大小為0的新卡片布局。publicCardLayout(int
hgap,int
vgap)創(chuàng)建一個具有指定水平間距和垂直間距的新卡片布局。水平間距置于左右邊緣。垂直間距置于上下邊緣。
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ū)域,每個網(wǎng)格大小相同組件按進入容器的順序裝入網(wǎng)格中(從第一行到最后一行,每行從左到右),強制組件與網(wǎng)格的大小相同常用方法
publicGridLayout()創(chuàng)建具有默認值的網(wǎng)格布局,即每個組件占據(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布局盒式容器的默認布局是盒式布局且不允許更改使用javax.swing包中的Box類及其子類創(chuàng)建的容器稱為盒式容器布局方式使用盒式布局的容器將組件排列在一行或一列
行型盒式布局將組件排列在一行,組件按加入的先后順序從左至右排列,組件上沿在同一水平線上
列型盒式布局將組件排列在一列,組件按加入的先后順序從上至下排列,組件左沿在同一垂直線上
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.Box常用方法
publicBoxLayout(Container
target,int
axis)創(chuàng)建一個將沿給定軸放置組件的布局管理器。
BoxLayout.X_AXIS組件從左到右放置BoxLayout.Y_AXIS組件從上到下放置BoxLayout.Line_AXIS根據(jù)目標容器的ComponentOrientation屬性確定的文本行方向放置組件BoxLayout.Page_AXIS根據(jù)目標容器的ComponentOrientation屬性確定的文本行在頁面中的流向來放置組件Box類的常用方法Box類是使用BoxLayout的輕量級容器在javax.swing包中
publicBox(int
axis)
創(chuàng)建一個沿指定坐標軸顯示其組件的Box
publicstaticBoxcreateVerticalBox()創(chuàng)建一個從上到下顯示其組件的BoxpublicstaticBoxcreateHorizontalBox()創(chuàng)建一個從左到右顯示其組件的Box
publicstaticComponentcreateHorizontalStrut(int
width)創(chuàng)建一個不可見的、固定寬度的組件(水平支撐組件)??煽刂平M件間的水平間距。publicstaticComponentcreateVerticalStrut(int
height)創(chuàng)建一個不可見的、固定高度的組件(垂直支撐組件)??煽刂平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布局布局方式提供具有不同大小的行和列放置組件,每個單元可有不同的大小維持一個動態(tài)的矩形單元網(wǎng)格,每個組件占用一個或多個這樣的單元每個由GridBagLayout管理的組件都與GridBagConstraints的實例相關(guān)聯(lián)。網(wǎng)格的總體方向取決于容器的ComponentOrientation屬性。水平自左向右:網(wǎng)格坐標(0,0)位于容器的左上角,其中X向右遞增,Y向下遞增水平自右向左:網(wǎng)格坐標(0,0)位于容器的右上角,其中X向左遞增,Y向下遞增
GridBagConstraints的成員gridx、gridy指定組件左上角在網(wǎng)格中的行與列容器中最左邊列的gridx=0,最右邊列的gridy=0GridBagConstraints.RELATIVE表示對應(yīng)的組件將放在前面放置組件的右邊或下面gridwidth、gridheight組件的橫向/縱向?qū)挾?,即組件占用的列數(shù)/行數(shù)使用GridBagConstraints.REMAINDER指定組件的顯示區(qū)域,該區(qū)域的范圍是從gridx/gridy到該行/列中的最后一個單元使用GridBagConstraints.RELATIVE指定組件的顯示區(qū)域,該區(qū)域的范圍是從gridx/gridy到其所在行/列的倒數(shù)第二個單元
fill
當顯示區(qū)域比組件的區(qū)域大時,可以用來控制組件的行為。GradBagConstraints.NONE默認GradBagConstraints.HORIZONTAL組件橫向充滿顯示區(qū)域,但不改變組件高度GradBagConstraints.VERTICAL組件縱向充滿顯示區(qū)域,但不改變組件寬度GradBagConstraints.BOTH組件橫縱向充滿其顯示區(qū)域ipadx、ipady
指定布局中組件的內(nèi)部填充,是組件最小大小在橫向/縱向方向的添加量。當fill取BOTH時不起作用。
insets
指定組件的外部填充,即組件間的間隙及組件與其顯示網(wǎng)格邊緣之間間距的最小量默認組件沒有外部填充anchor當組件小于顯示區(qū)域時,告訴布局管理器組件在顯示區(qū)域中的位置
絕對值NORTH、SOUTH、WEST、EAST、NORTHWEST、NORTHEAST、SOUTHWEST、SOUTHEAST、CENTER(默認)相對于方向的值PAGE_START、PAGE_END、LINE_START、LINE_END、FIRST_LINE_START、FIRST_LINE_END、LAST_LINE_START、LAST_LINE_END相對于基線的值BASELINE、BASELINE_LEADING、BASELINE_TRAILING、ABOVE_BASELINE、ABOVE_BASELINE_LEADING、ABOVE_BASELINE_TRAILING、BELOW_BASELINE、BELOW_BASELINE_LEADING和BELOW_BASELINE_TRAILINGweightx、weighty行/列的權(quán)重,告訴布局管理器在容器大小改變時,增加或減少的空間如何在組件間分配默認值是0,即所有的組件將聚攏在容器中心,多余的空間將放在容器邊緣與網(wǎng)格單元之間除非在行(weighty)和列(weightx)中至少指定一個組件的權(quán)重,否則所有組件都會聚集在其容器的中央。若組件橫跨多列,將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布局當處理一些手工繪圖時,需要自己來設(shè)置圖形的位置,不需要使用系統(tǒng)提供的布局管理器,可使用無布局管理器組件調(diào)用setBounds(inta,intb,intwidth,intheight)方法設(shè)置組件在容器中的位置和大小聯(lián)合布局GridBagLayoutBoxLayoutFlowLayout事件處理事件處理原理事件源組件對象名.addActionListener(監(jiān)聽者)監(jiān)聽者事件實現(xiàn)ActionListener接口publicvoidactionPerformed(ActionEvente)ActionEvent觸發(fā)注冊參數(shù)傳遞事件處理事件處理機制事件分類事件監(jiān)聽器事件適配器靈活設(shè)計事件監(jiān)聽器類用匿名內(nèi)置類實現(xiàn)事件監(jiān)聽器事件處理的多重運用修改組件的默認事件處理方式事件處理機制三個重要的概念事件:用戶對組件的一個操作,稱為一個事件事件源:發(fā)生事件的組件事件處理器:某個Java類中負責處理處理事件的成員方法,該方法接收一個事件對象,對其進行解釋,并作出相應(yīng)處理事件源、事件、事件處理器之間的工作關(guān)系:組件(事件源)事件處理器事件監(jiān)聽器注冊事件對象生成事件對象外部作用把事件對象傳入事件處理器事件處理采用基于層次模型的向上傳遞機制當事件發(fā)生時,首先發(fā)送給產(chǎn)生事件的組件,如果該組件不對事件進行處理,則事件將自動傳遞到包含組件的容器事件將沿著組件間的包含關(guān)系層層向上傳遞事件監(jiān)聽器一個事件監(jiān)聽器對象負責處理一類事件一類事件的每一種發(fā)生情況,分別由事件監(jiān)聽器對象中的一個方法進行處理在事件源和事件監(jiān)聽器對象中進行約定的接口類,被稱為事件監(jiān)聽器接口
Java中每類事件都定義了一個相應(yīng)的監(jiān)聽器接口,該接口中實現(xiàn)了事件處理方法事件監(jiān)聽器接口類的名稱與事件類的名稱是相對應(yīng)的,比如MouseEvent的事件類的監(jiān)聽器接口名是MouseListener事件監(jiān)聽器接口Java提供了抽象的響應(yīng)特定事件的”事件監(jiān)聽器”,在java.awt.event包中定義為接口這些接口都由
java.util.EventListener接口繼承而來事件源注冊的事件監(jiān)聽者必須實現(xiàn)相應(yīng)接口中的抽象方法,以進行事件處理一個事件監(jiān)聽者若要處理多種事件,就必須要實現(xiàn)多個事件接口。處理發(fā)生在某個GUI組件上的XXXEvent事件的某種情況,其事件處理的通用編寫流程:編寫一個實現(xiàn)了XXXListener接口的事件監(jiān)聽器類publicclassMyClassimplementsActionListener{……}XXXListener類中的用于處理該事件情況的方法中,編寫處理代碼publicclassMyClassimplementsActionListener{……publicvoidactionPerformed(ActionEvente){……}……}調(diào)用組件的addXXXListener方法,將類XXXListener創(chuàng)建的實例對象注冊到GUI組件上someComponent.AddActionListener(newMyClass());publicvoidaddActionListener(
ActionListener
l)l可以引用任何實現(xiàn)了該接口的類所創(chuàng)建的對象,當事件源發(fā)生事件時,接口l立刻回調(diào)被類實現(xiàn)的接口中的某個方法,即采用接口回調(diào)技術(shù)事件處理的多重運用一個組件上的一個動作可以產(chǎn)生多種不同類型的事件組件(事件源)外部作用事件對象1事件對象2事件處理器1事件處理器2……一個事件監(jiān)聽器對象可以注冊到多個事件源上組件1(事件源1)外部作用事件對象事件處理器…組件2(事件源2)在一個事件源上也可以注冊對同一類事件進行處理的多個事件監(jiān)聽器對象組件(事件源)外部作用事件對象事件處理器1…事件處理器2這些事件處理方法的調(diào)用順序系統(tǒng)是沒有定義的適配器類JDK中提供了大多數(shù)事件監(jiān)聽器接口的最簡單的實現(xiàn)類,稱為事件適配器類
事件監(jiān)聽器所在的類可以用適配器類作為父類,覆蓋要實現(xiàn)的方法,其余未實現(xiàn)的方法采用適配器類中的默認方式實現(xiàn)事件監(jiān)聽器所在的類可作為獨立類,也可作為組件所在類的內(nèi)部類或匿名內(nèi)部類用事件適配器來處理事件,可以簡化事件監(jiān)聽器的編寫事件適配器的不足如果事件監(jiān)聽器類已繼承其他類,就不能再繼承事件適配器類可以采用內(nèi)部類和匿名內(nèi)部類解決該問題如果監(jiān)聽器接口中只有一個方法,那么JDK沒必要為它形成一個適配器事件處理的幾種方法組件所在的類實現(xiàn)接口,用本類對象作為事件監(jiān)聽器classWinextendsJFrameimplementsActionListener{JButtonbtn;Win(){btn=newButton(“button”);
btn.addActionListener(this);…………}
publicvoidactionPerformed(ActionEvente){……}}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}
用組件所在類(設(shè)為類A)之外的類(設(shè)為類B)對象作為事件監(jiān)聽器,類B實現(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();}}單獨類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)效果進行分類MouseEventWindowEventActionEvent……事件類型在javax.swing.event中出現(xiàn)了一些新的swing組件事件類型TextEvent事件事件源:TextComponent、TextArea、TextField常量Text_VALUE_CHANGED
表示文本發(fā)生改變
KeyEvent事件
在InputEvent類中
publicbooleanisControlDown()publicbooleanisShiftDown()publicbooleanisMetaDown()publicbooleanisAltDown()判斷某個特定修飾符是否被按下publicintgetModifiers()返回修飾符KeyEvent類定義KEY_PRESSED、KEY_RELEASED、KEY_TYPED事件
publicintgetKeyCode()
返回按鍵的Unicode碼publicchargetKeyChar()
返回按鍵對應(yīng)的字符
publicstaticStringgetKeyText(int
keyCode)返回對按鍵描述的字符串
publicstaticStringgetKeyModifiersText(int
modifiers)
返回對修飾符描述的字符串處理復(fù)合鍵
e.getModifiers()==InputEvent.CTRL_MASK&&e.getKeyCode()==KeyEvent.VK_XInputEvent
SHIFT_MASKCTRL_MASKMETA_MASKALT_MASKALT_GRAPH_MASKBUTTON1_MASKBUTTON2_MASKBUTTON3_MASK復(fù)合鍵示例在窗口中放一個紅色按鈕按下shift+X,按鈕向右下方向各移動100按下ctrl+X,按鈕的長和寬各增加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按動鼠標按鍵
MOUSE_PRESSED按下鼠標按鍵
MOUSE_RELEASED釋放鼠標按鍵
MOUSE_MOVED移動鼠標
MOUSE_ENTERED鼠標移入組件
MOUSE_EXITED鼠標離開組件
MOUSE_DRAGGED拖動鼠標常用方法
publicintgetX()
publicintgetY()publicPointgetPoint()publicintgetClickCount()鼠標事件示例在窗口上添加一個按鈕和帶滾動條的文本區(qū)在按鈕上按下鼠標,在文本區(qū)中顯示按下點的坐標在按鈕上釋放鼠標,在文本區(qū)中顯示釋放點的坐標鼠標進入和退出按鈕時,在文本區(qū)中顯示相應(yīng)信息拖動按鈕和移動鼠標時,在文本區(qū)中顯示相應(yīng)信息在按鈕上點擊鼠標,在文本區(qū)中顯示點擊位置的坐標,用右鍵還是左鍵點擊,點擊次數(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事件焦點的永久變化:焦點從一個組件直接移動到另一個部件
publicvoidrequestFocus()java.awt.Component
焦點的暫時變化:對組件進行非直接操作【作業(yè)】利用鼠標進行繪圖點擊窗口中的空白處,得到一張“笑臉”的圖像;點擊已存在的圖像,圖像在“笑臉”和“哭臉”之間切換;用鼠標可以對圖像進行拖動操作;在窗口左上角,顯示當前鼠標光標的位置運行結(jié)果如下:焦點事件示例在窗口上放三個長度為7的文本框當一個文本框輸入滿后,焦點自動轉(zhuǎn)移到下一個文本框獲得焦點的文本框自動清空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)是獲得焦點的Window,則請求此Component獲取輸入焦點*/publicvoidfocusGained(FocusEvente){TextFieldtext=(TextField)e.getSource();text.setText(null);}
publicvoidkeyPressed(KeyEvente){TextFieldt=(TextField)e.getSource();if(t.getCaretPosition(
)>=6)//返回文本插入符的位置
t.transferFocus();//將焦點轉(zhuǎn)移到下一個組件}WindowEvent事件WindowListener接口publicvoidwindowActivated(WindowEvente)窗口從非激活狀態(tài)到激活狀態(tài)時publicvoidwindowDeactivated(WindowEvente)窗口從激活狀態(tài)到非激活狀態(tài)時publicvoidwindowClosing(WindowEvente)窗口正在被關(guān)閉publicvoidwindowClosed(WindowEvente)窗口關(guān)閉時publicvoidwindowIconified(WindowEvente)窗口圖標化時publicvoidwindowDeiconified(WindowEvente)窗口撤銷圖標化時publicvoidwindowOpened(WindowEvente)窗口打開時單擊窗口右上角的圖標化按鈕
windowIconified()windowDeactivated()撤消窗口圖標化
windowDeiconified()windowActivated()單擊窗口的關(guān)閉圖標
windowClosing()(調(diào)用dispose()方法)執(zhí)行窗口初始化時用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)視器沒有機會調(diào)用windowClosed()方法窗口事件示例在窗口中添加一個帶滾動條的文本區(qū)窗口打開、被激活、未激活、圖標化和未圖標化時在文本區(qū)中顯示相應(yīng)信息窗口正被關(guān)閉及已關(guān)閉,在控制臺輸出相應(yīng)信息publicvoidwindowActivated(WindowEvente){ta.append("窗口被激活\n");}publicvoidwindowDeactivated(WindowEvente){ta.append("窗口未被激活\n");}publicvoidwindowOpened(WindowEvente){ ta.append("窗口被打開");} publicvoidwindowIconified(WindowEvente){ta.append("窗口被圖標化\n");} publicvoidwindowDeiconified(WindowEvente){ta.append("窗口未被圖標化\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事件源可注冊多個監(jiān)聽器,此類管理一個由
事件監(jiān)聽器鏈構(gòu)成的結(jié)構(gòu),將事件發(fā)送到所有的監(jiān)聽器此類實現(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)聽器中的事件處理方法自定義事件示例點擊start開始計數(shù),計數(shù)完畢產(chǎn)生一個自定義事件該自定義事件傳遞給自定義組件的事件偵聽者,并在文本框中輸出信息指出事件源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)建注冊注冊修改事件的默認處理方式只有在一個組件上注冊了某種事件的事件監(jiān)聽器對象后,組件才會產(chǎn)生相應(yīng)的事件對象默認的processEvent方法調(diào)用相應(yīng)的processXXXEvent方法調(diào)用enableEvents(long)方法,可以在即使沒有注冊事件監(jiān)聽器的情況下,組件也能夠?qū)δ承╊愋偷氖录M行響應(yīng)和產(chǎn)生相應(yīng)的事件對象Canvas是具有最基本和最簡單的GUI功能的組件Canvas代表屏幕上的一塊空白的矩形區(qū)域,程序能夠在這個部件表面繪圖,也能夠捕獲用戶的操作,產(chǎn)生相應(yīng)的事件當要設(shè)計自定制的具有GUI功能的組件類時,繼承Canvas將會大大簡化編程難度編程實例:設(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是事件的識別碼常量SHIFT_MASK、CTRL_MASK、ALT_MASK、META_MASK
表示事件發(fā)生時同時按下的鍵
publicStringgetActionCommand()
返回與此動作相關(guān)的命令字符串。如Button的命令字是按鈕的標簽,List的命令字是選擇項,TextField的命令字是輸入字符串文本框上的文檔類型
publicJTextField(Document
doc,String
text,int
columns)用指定的文檔document創(chuàng)建一個文本框,文本框的默認文檔類型是PlainDocumentjavax.swing.text.AbstractDocument
javax.swing.text.PlainDocument
PlainDocument類的重要方法
insertString(intoffset,Strings,AttributeSeta)在文本框中進行字符輸入操作時,自動執(zhí)行publicvoidremove(int
offs,int
len)
在文本框中進行字符刪除操作時,自動執(zhí)行
javax.swing.text.AbstractDocumentpublicvoidsetDocument(Document
doc)javax.swing.JTextField
改變文本框的文檔類型
JPasswordField
javax.swing.JTextField
javax.swing.JPasswordField默認回顯字符是‘*’常用函數(shù)
publicvoidsetEchoChar(char
c)publicchargetEchoChar()publicchar[]getPassword()
可以觸發(fā)ActionEvent事件
字體:粗斜
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年農(nóng)產(chǎn)品的安全試題及答案
- 保健按摩師中級練習卷含答案
- 中醫(yī)基礎(chǔ)理論試題-定科練習卷含答案
- 2025年職業(yè)病試題及答案
- 2025年酒醉心理測試題及答案
- 2025年大學藝術(shù)類試題及答案
- 2025年裝配電工筆試題及答案
- 2025年高一物理動能試題及答案
- 2025年校招專員面試試題及答案
- 2025年廣西單招數(shù)學試題及答案
- 部編版六年級下冊語文教案(全冊)
- 2022年湖北成人學士學位英語真題及答案
- DB43∕T 801-2013 二次張拉低回縮鋼絞線豎向預(yù)應(yīng)力短索錨固體系設(shè)計、施工和驗收規(guī)范
- 附表1:網(wǎng)絡(luò)及信息安全自查表
- 奇妙的海洋生物
- 精裝修工程一戶一驗記錄表
- 公共場所健康證體檢表
- 普通高等學校獨立學院教育工作合格評估指標體系(第六稿)
- 哈薩克斯坦共和國有限責任公司和補充責任公司法
- 多維閱讀第13級—A Stolen Baby 小猩猩被偷走了
- 三愛三節(jié)-主題班會
評論
0/150
提交評論