chapter-10-Java-Swing-圖形用戶界面1_第1頁
chapter-10-Java-Swing-圖形用戶界面1_第2頁
chapter-10-Java-Swing-圖形用戶界面1_第3頁
chapter-10-Java-Swing-圖形用戶界面1_第4頁
chapter-10-Java-Swing-圖形用戶界面1_第5頁
已閱讀5頁,還剩92頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Java語言程序設計主要內容窗口文本框、按紐、標簽和文本區(qū)布局選擇性組件容器表格和樹窗口事件、鼠標事件和鍵盤事件使用MVC結構與中介者模式概述圖形用戶界面〔GraphicsUserInterface,縮寫GUI〕是指以圖形的顯示方式與用戶實現(xiàn)交互操作的應用程序界面。Java提供了十分完善的圖形用戶界面功能,使得軟件開發(fā)人員可以輕而易舉地開發(fā)出功能強大、界面友善、平安可靠的應用軟件。

開展歷史:命令行——》圖形用戶界面

概述在Java語言中,有兩個包〔java.awt和javax.swing〕囊括了實現(xiàn)圖形用戶界面的所有根本元素,這些根本元素主要包括容器、組件、繪圖工具和布局管理器等。java.awt是java1.1用來建立GUI的圖形包,“awt”是抽象窗口工具包〔AbstractWindowToolkit〕的縮寫,其中的組件常被稱為AWT組件。javax.swing是Java2提出的AWT的改進包,它主要改善了組件的顯示外觀,增強了組件的控制能力。概述早期版本的AWT組件在java.awt包里,包括Button、Checkbox、Scrollbar等,都是Component類的子類大局部含有nativecode,所以隨操作系統(tǒng)平臺的不同會顯示出不同的樣子,而不能進行更改,是重量級組件(heavyweightcomponents)沒有彈性、缺乏效率概述較新的Swing組件其名稱都是在原來AWT組件名稱前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponent類的子類Java1.2推出,架構在AWT之上,是AWT的擴展而不是取代,AWT仍然是Swing的一個必備補充完全是由java語言編寫的,其外觀和功能不依賴于任何由宿主平臺的窗口系統(tǒng)所提供的代碼,是輕量級組件〔lightweightcomponents〕可提供更豐富的視覺感受,被越來越多地使用概述在javax.swing包中,定義了兩種類型的組件:容器和組件。容器各種組件必須放在容器容器本身也是一種組件分類頂層容器,如JFrame,JApplet,JDialog和JWindow其它容器,如JPanel,JScrollPane,JSplitPane,JToolBar組件根本控制組件,如JButton,JComboBox,JList,JMenu,JSlider,JTextField不可編輯的信息顯示組件,如JLabel,JProgressBar,JToolTip可編輯的信息顯示組件,如JColorChooser,JFileChooser,JTable,JTextArea8Swing的類層次結構Swing的類層次結構java.awt.Component

|——java.awt.Container

——java.awt.Window

——java.awt.Frame—javax.swing.JFrame

——javax.Dialog—javax.swing.JDialog

——javax.swing.JWindow

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

——javax.swing.Box

——javax.swing.JComponet10.2窗口Java提供的JFrame類的實例是一個底層容器,即通常所稱的窗口。其他組件必須被添加到底層容器中,以便借助這個地層容器和操作系統(tǒng)進行信息交互。JFrame類是Container類的間接子類。當需要一個窗口時,可使用JFrame或其子類創(chuàng)立一個對象。10.2窗口JFrame是一種具有邊框的容器,它是JavaApplication程序的圖形用戶界面的最外層容器。特點:〔1〕有邊框〔2〕能被移動、縮放和關閉〔3〕作為最外層容器,不能被其它容器所包含〔4〕默認布局:邊界布局(BorderLayout)10.2窗口構造函數(shù)格式:JFrame()功能:建立一個無標題的Frame。格式:JFrame(Stringtitle)功能:建立一個標題為title的Frame。常用方法StringgetTitle();獲取窗口標題voidsetTitle(Strings);設置窗口標題voidsetVisible(booleanb);設置窗口可見性voidsetBounds(inta,intb,intwidth,intheight);設置窗口位置和大小voidsetBackground(Colorc);設置窗口背景顏色voidpack();用緊湊方式顯示窗口voidsetSize(intwidth,intheight);設置窗口大小10.2窗口創(chuàng)立窗體有兩種方式:〔1〕直接創(chuàng)立JFrame的對象,適合于簡單窗體;〔2〕繼承JFrame類,在繼承類中編寫代碼對窗體進行詳細的刻畫,適合窗體比較復雜的情況。大多數(shù)情況下開發(fā)人員都用第二種方法。注意:窗體創(chuàng)立以后是不可見的,必須調用Window類的show()方法或Component類的setVisible()方法顯示該窗體。見以下兩個例子:importjavax.swing.*;publicclassSample10_1{ publicstaticvoidmain(String[]args){ //創(chuàng)立一個窗體對象JFramemyWindow=newJFrame(); //向窗體中添加一個標簽 myWindow.add(newJLabel("這是一個窗體,演示了JFrame類的根本功能")); //設置窗體的標題 myWindow.setTitle("自定義的窗體"); //設置窗體的大小 myWindow.setBounds(80,80,480,180); //根據(jù)接收的boolean設置窗體是否可以調整大小 myWindow.setResizable(false); //設置窗體的可見性 myWindow.setVisible(true);

}}直接創(chuàng)立JFrame的對象importjavax.swing.*;classMyWindowextendsJFrame{ //定義無參構造函數(shù) publicMyWindow(){} publicMyWindow(booleanb){ //向窗體中添加一個標簽 this.add(newJLabel("這是一個窗體,演示了JFrame類的根本功能")); //設置窗體的標題 this.setTitle("自定義的窗體"); //設置窗體的大小 this.setBounds(80,80,480,180); //根據(jù)接收的boolean設置窗體是否可以調整大小 this.setResizable(b); //設置窗體的可見性 this.setVisible(true); }}publicclassSample10_2{ publicstaticvoidmain(String[]args){ //創(chuàng)立MyWindow類的對象,并傳遞False值使得窗體不能調整大小 newMyWindow(false); }}繼承JFrame類對話框〔JDialog〕對話框〔JDialog〕與JFrame一樣,都是有邊框和標題的獨立使用的容器,不能被其它容器所包容。與JFrame的不同之處:不能作為程序的最外層容器,它必須屬于某個JFrame,由該JFrame彈出。對話框可以接受用戶的輸入,實現(xiàn)與用戶的交互作用。對話框〔JDialog〕JDialog的繼承結構└javax.swing.JDialog要實現(xiàn)對話框,需要從JDialog派生一個類對話框〔JDialog〕構造函數(shù)JDialog(Frameowner)功能:建立無標題的通用對話框,它屬于窗口owner,可以響應其它窗口。JDialog(Frameowner,booleand)功能:建立無標題的通用對話框,它屬于窗口owner,假設d為true那么不能響應其它窗口。JDialog(Frameowner,Stringtxt)功能:建立標題為txt的通用對話框,它屬于窗口owner,可以響應其它窗口。JDialog(Frameowner,Stringtxt,booleand)功能:建立標題為txt的通用對話框,它屬于窗口owner,假設d為true那么不能響應其它窗口。對話框〔JDialog〕常用方法表列出了通用對話框JDialog類的幾個常用的方法。面板(JPanel)無邊框容器特點:〔1〕最簡單的一種容器〔2〕沒有邊框〔3〕不能被移動、縮放和關閉〔4〕通常作為一個容器組件被加到其它容器中,如JApplet,JFrame等〔5〕默認布局:順序布局(FlowLayout)JApplet是JPanel的子類,是一種特殊的JPanelJPanel常用方法:標簽1.創(chuàng)立標簽標簽〔JLabel〕的功能是顯示單行的字符串,可在屏幕上顯示一些提示性、說明性的文字。例如,在列表框的旁邊加上一個標簽,說明列表框的功能。2.標簽的構造方法〔1〕JLabel()該方法用來創(chuàng)立一個沒有顯示內容的對象?!?〕JLabel(Stringlabel)該方法用來創(chuàng)立一個顯示內容為label的對象。〔3〕JLabel(Stringlabel,intalignment)該方法除了用來創(chuàng)立一個顯示內容為label的對象外,還設置了Label的對齊方式。Label的對齊方式有三種,分別用JLabel類的三個常量LEFT、CENTER和RIGHT來表示左對齊、居中對齊和右對齊?!?〕JLabel(Iconico)建立一個JLabel對象,其初始圖標為ico,沒有標題?!?〕JLabel(Stringtxt,Iconico,inthalign)功能:建立一個JLabel對象,其初始標題為txt,初始圖標為ico,水平對齊方式為halign。標簽3.標簽的常用方法〔1〕publicintgetAlignment()返回當前的對齊方式。〔2〕publicStringgetText()返回當前顯示的字符串?!?〕publicvoidsetAlignment(intalignment)設置對齊方式?!?〕publicvoidsetText(Stringlabel)設置顯示的字符串。標簽按鈕1.按鈕的構造方法〔1〕JButton()創(chuàng)立一個沒有標題的按鈕?!?〕JButton(Stringlabel)創(chuàng)立一個有顯示標題的按鈕?!?〕JButton(Iconico)建立一個JButton對象,圖標為ico,沒有標題?!?〕JButton(Stringtxt,Iconico)建立一個JButton對象,標題為txt,圖標為ico。2.按鈕的常用方法〔1〕publicStringgetLabel()返回按鈕的顯示標題?!?〕publicvoidsetLabel(Stringlabel)設置按鈕上的顯示標題。按鈕以上方法是各種按鈕共有的方法,因為它是AbstractButton抽象類里定義的方法。按鈕類AbstractButton抽象類是眾多按鈕類的基類,繼承它的類包括JButtonJToggleButton——表示有兩個選擇狀態(tài)的按鈕CheckBox〔多項選擇按鈕〕JRadioButton〔單項選擇按鈕〕JMenuItem——在菜單中使用JCheckBoxMenuItem〔多項選擇按鈕〕JRadioButtonMenuItem〔單項選擇按鈕〕JMenu〔一般的菜單項〕importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassButtonDemoextendsJFrameimplementsActionListener{protectedJButtonbutton1,button2;protectedJLabellabel1;protectedintclickedNum=0;

publicButtonDemo(Stringtitle){ setTitle(title); label1=newJLabel("共點擊了"+clickedNum+"次");

button1=newJButton("點我");button2=newJButton("清零");button1.addActionListener(this);button2.addActionListener(this);setLayout(newFlowLayout());setSize(400,200);

add(button1);add(button2);add(label1);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==button1){ clickedNum++; }if(e.getSource()==button2){ clickedNum=0; }label1.setText("共點擊了"+clickedNum+"次");}

publicstaticvoidmain(String[]args){ButtonDemoframe=newButtonDemo("ButtonDemo1");frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});frame.setVisible(true);}}單項選擇按鈕JRadioButton1.構造函數(shù)JRadioButton() 功能:建立一個無標題、無圖片的單項選擇按鈕。JRadioButton(Stringtxt) 功能:建立一個標題為txt但沒有圖片的單項選擇按鈕。JRadioButton(Iconico)功能:建立一個圖片為ico但沒有標題的單項選擇按鈕。JRadioButton(Stringtxt,Iconico)功能:建立一個標題為txt、圖片為ico的單項選擇按鈕。JRadioButton(Stringtxt,booleanstat)功能:建立一個標題為txt但沒有圖片的單項選擇按鈕,其初始選擇狀態(tài)由stat指定。JRadioButton(Iconico,booleanstat)功能:建立一個圖片為ico但沒有標題的單項選擇按鈕,其初始選擇狀態(tài)由stat指定。JRadioButton(Stringtxt,Iconico,booleanstat)功能:建立一個標題為txt、圖片為ico的單項選擇按鈕,其初始選擇狀態(tài)由stat指定。復選按鈕JCheckBox復選按鈕〔JCheckbox〕可以讓用戶作出多項選擇。1.構造函數(shù)JCheckBox()功能:建立一個無標題、無圖片的復選按鈕。JCheckBox(Stringtxt) 功能:建立一個標題為txt但沒有圖片的復選按鈕。JCheckBox(Iconico)功能:建立一個圖片為ico但沒有標題的復選按鈕。JCheckBox(Stringtxt,Iconico)功能:建立一個標題為txt、圖片為ico的復選按鈕。JCheckBox(Stringtxt,booleanstat)功能:建立一個標題為txt但沒有圖片的復選按鈕,其初始選擇狀態(tài)由stat指定。JCheckBox(Iconico,booleanstat)功能:建立一個圖片為ico但沒有標題的復選按鈕,其初始選擇狀態(tài)由stat指定。JCheckBox(Stringtxt,Iconico,booleanstat)功能:建立一個標題為txt、圖片為ico的復選按鈕,其初始選擇狀態(tài)由stat指定。列表框列表框〔JList〕可以使用戶選擇多個選項。1.構造函數(shù)格式:JList()功能:建立一個單項選擇的JList對象。格式:JList(Object[]data)功能:建立一個單項選擇且初始數(shù)據(jù)為data的JList對象。例如:String[]stu={"王小平","劉國軍","吳芬","李建軍"};Listjl=newJList(stu);這就創(chuàng)立了一個列表框,其初始數(shù)據(jù)有4項,分別為:"王小平"、"劉國軍"、"吳芬"、"李建軍"。2.常用方法略組合框組合框〔JComboBox〕可以使用戶選擇多個選項。1.構造函數(shù)格式:JComboBox()功能:創(chuàng)立具有默認數(shù)據(jù)模型的組合框;格式:JComboBox(Object[]data)功能:建立一個初始數(shù)據(jù)為data的組合框對象。例如:String[]stu={"王小平","劉國軍","吳芬","李建軍"};JComboBoxjl=newJComboBox(stu);這就創(chuàng)立了一個列表框,其初始數(shù)據(jù)有4項,分別為:"王小平"、"劉國軍"、"吳芬"、"李建軍"。2.常用方法略文本框1.單行文本編輯框JTextField用來接受用戶鍵盤輸入的單行文本信息。2.文本框的構造方法〔1〕JTextField()創(chuàng)立一個缺省長度的文本框?!?〕JTextField(intcolumns)創(chuàng)立一個指定長度的文本框?!?〕JTextField(Stringtext)創(chuàng)立一個帶有初始文本內容的文本框?!?〕JTextField(Stringtext,intcolumns)創(chuàng)立一個帶有初始文本內容并具有指定長度的文本框。3.文本框的常用方法文本框文本區(qū)1.文本區(qū)〔JTextArea〕可以顯示大段的文本。

2.文本區(qū)的構造方法〔1〕JTextArea()創(chuàng)立一個缺省大小的文本區(qū)?!?〕JTextArea(introws,intcolumns)創(chuàng)立一個指定行和列數(shù)的文本區(qū)?!?〕JTextArea(Stringtext)創(chuàng)立一個帶有初始文本內容的文本區(qū)。〔4〕JTextArea(Stringtext,introws,intcolumns)創(chuàng)立一個帶有初始文本內容并具有指定行和列數(shù)的文本區(qū)。〔5〕JTextArea(Stringtext,introws,intcolumns,intscrollbars)在〔4〕的根底上添加滾動條。3.文本區(qū)的常用方法文本區(qū)36菜單常規(guī)菜單:菜單欄(JMenuBar)、下拉式菜單(JMenu)和菜單項。菜單項:命令式菜單項(JMenuItem)、復選菜單項(JCheckBoxMenuItem)和單項選擇菜單項(JRadioButtonMenuItem)彈出式菜單37菜單的用法JMenuBarjmb=newJMenuBar();//定義菜單欄

JMenufile=newJMenu("File");//定義菜單

JMenuItemitem1=newJMenuItem("Open");//定義菜單項

JMenuItemitem2=newJMenuItem("Save");JMenuItemitem3=newJMenuItem("Close");JRadioButtonMenuItemJRMenuItem1=newJRadioButtonMenuItem("one",(Icon)newImageIcon("face5.gif"));JRadioButtonMenuItemJRMenuItem2=newJRadioButtonMenuItem(“two”);//定義互斥菜單項,其中的“one”帶圖標

ButtonGroupbgroup=newButtonGroup();//定義選項組對象

JPopupMenupopup=newJPopupMenu("mypopup");//定義彈出式菜單

JMenuItemit1=newJMenuItem("popupone");//定義彈出式菜單的菜單項

JMenuItemit2=newJMenuItem("popuptwo");38菜單的用法setJMenuBar(jmb);jmb.add(file);//將菜單File參加菜單欄file.add(item1);//參加菜單File的各菜單項file.add(item2);file.add(item3);file.addSeparator();//菜單File中參加一分割線bgroup.add(JRMenuItem1);//將互斥菜單項參加選項組bgroup.add(JRMenuItem2);file.add(JRMenuItem1);//將互斥菜單項參加菜單Filefile.add(JRMenuItem2);39表格表格是Swing新增加的組件,主要功能是把數(shù)據(jù)以二維表格的形式顯示出來。表格用javax.swing.table.JTable類來實現(xiàn)JTable類常用的方法有:JTable(TableModeldm)//dm對象中包含了表格要顯示的數(shù)據(jù)JTable(object[][]rowData,object[]columnNams);JTable(Vector[][]rowData,Vector[]columnNams);getModel()//獲得表格的數(shù)據(jù)來源對象40創(chuàng)立并顯示一張表格Object[][]data={{"Jenny","female","football",newInteger(20),"ENGLISH"},{"May","female","music",newInteger(20),"ENGLISH"},{"Lili","female","art",newInteger(20),"CHINESE"}};Object[]columnNames={"name","sex","hobby","age",“nationality"};JTablejtable1=newJTable(data,columnNames);jtable1.setRowHeight(20);JScrollPanejscrp1=newJScrollPane();jscrp1.getViewport().add(jtable1);JComponent類JComponent類是所有組件的父類,下面介紹JComponent類的常用方法1、組件的顏色publicvoidsetBackground(Colorc)設置組件的背景色。publicvoidsetForeground(Colorc)設置組件的前景色。publicColorgetBackground()獲取組件的背景色。publicColorgetForeground()獲取組件的前景色。2.組件的字體publicvoidsetFont(Fontf)組件調用該方法設置組件上的字體。例如,文本組件調用該方法可以設置文本組件中的字體。

publicFontgetFont()組件調用該方法獲取組件上的字體。3.組件的激活與可見性publicvoidsetEnabled(booleanb)組件調用該方法可以設置組件是否可被激活,當參數(shù)b取值true時,組件可以被激活,當參數(shù)b取值false時,組件不可激活。默認情況下,組件是可以被激活的。publicvoidsetVisible(boolean)設置組件在該容器中的可見性,當參數(shù)b取值true時,組件在容器中可見,當參數(shù)b取值false時,組件在容器中不可見。除了Window型組件外,其它類型組件默認是可見的。JComponent類4.組件的大小與位置publicvoidsetSize(intwidth,intheight)組件調用該方法設置組件的大小。publicvoidsetLocation(intx,inty)組件調用該方法設置組件在容器中的位置,包含該組件的容器都有默認的坐標系,容器的坐標系的左上角的坐標是(0,0),參數(shù)x,y指定該組件的左上角在容器的坐標系中的坐標,即組件距容器的左邊界x個像素,距容器的上邊界y個像素。publicDimensiongetSize()組件調用該方法返回一個Dimension對象的引用,該對像實體中含有名字是width和height的成員變量,方法返回的Dimension對象的width的值就是組件的寬度、height的值就是當前組件的高度。JComponent類publicPointgetLocation()組件調用該方法返回一個Point對象的引用,該對像實體中含有名字是x和y的成員變量,方法返回的Point對象的x,y的值就是組件的左上角在容器的坐標系中的x坐標和y坐標。publicvoidsetBounds(intx,inty,intwidth,intheight)組件調用該方法設置組件在容器中的位置和組件的大小。該方法相當于setSize方法和setLocation方法的組合。publicRectanglegetBounds()組件調用該方法返回一個Rectangle對象的引用,該對象實體中含有名字是x、y、width和height的成員變量,方法返回的Rectangle對象的x,y的值就是組件的左上角在容器的坐標系中的x坐標和y坐標,width和height的值就是當前組件的寬度和高度。5.組件上的光標publicvoidsetCursor(Cursorc)設置鼠標指向組件時的光標形狀??梢允褂肅ursor類的類方法直接獲得一個光標對象,例如:Cursorc=Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);6.paint方法與repaint方法調用repaint()方法時,repaint()方法會再去調用update(Graphicsg)方法。update(Graphicsg)方法也是Component類中的一個方法,這個方法的功能是:去除paint()方法以前所畫的內容,然后再調用paint方法。因此我們可以在子類中重寫update方法〔即隱藏父類的方法〕,根據(jù)需要來去除哪些局部或保存哪些局部。JComponent類46布局管理器流式布局FlowLayout邊界布局BorderLayout盒式布局管理器BoxLayout網格布局GridLayout卡片布局CardLayout網格包布局GridBagLayout471、流式布局FlowLayout是一種最根本的布局管理器是、和的默認布局方式在容器中,從左到右依次放置GUI組件當組件排到容器一行的末尾時,那么從下一行開始接著排列組件每行組件的對齊方式可以是:左對齊、中間(默認對齊方式)和右對齊48FlowLayout的構造方法publicFlowLayout()publicFlowLayout(intalignment)publicFlowLayout(intalignment,inthorizontalGap,intverticalGap)alignment參數(shù)的值必須是FlowLayout.LEFT、Flowlayout.CENTER或FlowLayout.RIGHT。horizontalGap和verticalGap參數(shù)指定了組件間隔距離(以像素為單位)。FlowLayout的默認間隔值為5。49例6:FlowLayout的使用方法importjava.awt.*;importjavax.swing.*;publicclassFlowLayoutDemoextendsJFrame{publicFlowLayoutDemo(){Containerc=getContentPane();c.setLayout(newFlowLayout());c.add(newJLabel("Buttons:"));c.add(newJButton("Button1"));c.add(newJButton("2"));c.add(newJButton("Button3"));c.add(newJButton("Long-NamedButton4"));c.add(newJButton("Button5"));}publicstaticvoidmain(Stringargs[]){FlowLayoutDemowindow=newFlowLayoutDemo();window.setTitle("FlowLayoutDemo");window.pack();//窗口大小設置為適合組件最正確尺寸與布局所需的空間window.setVisible(true);}}502、邊界布局BorderLayout是容器JFrame和JApplet的默認布局方式將容器分成五個區(qū)域,NORTH (頂部)SOUTH (底部)WEST (左側)EAST (右側)CENTER (中間)每個區(qū)域最多只能1個組件51BorderLayout的方法構造方法:BorderLayout()構造一個組件之間沒有間距的新邊界布局。BorderLayout(int

hgap,int

vgap)用指定的組件之間的水平間距構造一個邊界布局。

將組件添加到BorderLayout布局的容器中的方法add(newButton("South"),BorderLayout.SOUTH);add(newButton("South"),"South");add("South",newButton("South"));52例7:BorderLayout的使用方法importjava.awt.*;importjavax.swing.*;publicclassBorderLayoutDemoextendsJFrame{publicBorderLayoutDemo(){ Containerc=getContentPane();c.setLayout(newBorderLayout(5,5));c.add(newJButton("North"),"North");c.add(newJButton("South"),"South");//c.add("South",newButton("South"));//c.add(newButton("South"),BorderLayout.SOUTH);c.add(newJButton("East"),"East");c.add(newJButton("West"),"West");c.add(newJButton("Center"),"Center");}publicstaticvoidmain(Stringargs[]){BorderLayoutDemowindow=newBorderLayoutDemo();window.setTitle("BorderLayoutDemo");window.pack();window.setVisible(true);}}533、盒式布局管理器BoxLayout允許多個組件在容器中沿水平方向或豎直方向排列容器的大小發(fā)生變化時,組件占用的空間不會發(fā)生變化54BoxLayout的方法構造方法:BoxLayout(Containertarget,intaxis)創(chuàng)立一個將沿給定軸放置組件的布局管理器。軸的方向:BoxLayout.X_AXIS:指定組件應該從左到右放置BoxLayout.Y_AXIS:指定組件應該從上到下放置55例8:BoxLayout使用的例子importjava.awt.Container;importjavax.swing.BoxLayout;importjavax.swing.JButton;importjavax.swing.JFrame;publicclassBoxLayoutDemo{publicstaticvoidmain(Stringargs[]){JFrameapp=newJFrame("盒式布局管理器例程");app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(220,130);Containerc=app.getContentPane();c.setLayout(newBoxLayout(c,BoxLayout.X_AXIS));Strings;JButtonb;for(inti=0;i<3;i++){s="按鈕"+(i+1);b=newJButton(s);c.add(b);}app.setVisible(true);}}564、網格布局GridLayout布局管理器GridLayout按行與列將容器等分成網格每個組件占用具有相同寬度和高度的網格添加組件占用網格的順序:從上到下,從左到右當一行滿了,那么繼續(xù)到下一行,仍然是從左到右57GridLayout類的構造方法GridLayout()

創(chuàng)立默認值的網格布局,即每個組件占據(jù)一行一列。GridLayout(int

rows,int

cols)

創(chuàng)立具有指定行數(shù)和列數(shù)的網格布局GridLayout(int

rows,int

cols,int

hgap,int

vgap)

創(chuàng)立具有指定行數(shù)和列數(shù)的網格布局。58例9:GridLayout的使用方法importjava.awt.*;importjavax.swing.*;publicclassGridLayoutDemo{JFramef;publicGridLayoutDemo(Stringstr){f=newJFrame(str);Containerc=f.getContentPane();

c.setLayout(newGridLayout(3,2));for(inti=1;i<=6;i++){ c.add(newJButton(i+""));}f.pack();f.setVisible(true);}publicstaticvoidmain(Stringargs[]){newGridLayoutDemo("GridLayoutDemo");}}595、卡片布局管理器CardLayoutCardLayout的布局方式有點象碼“撲克牌”一個組件壓在另一個組件的上面,所以每次一般只能看到一個組件CardLayout的構造方法:CardLayout();參加組件的方法:add(<組件代號>,<組件名稱>);<組件代號>為一個字符串常用方法:show(<容器名稱>,<組件名稱>);//顯示組件first(<容器名稱>);//顯示容器中的第一個組件last(<容器名稱>);//顯示容器中的最后一個組件next(<容器名稱>);//顯示容器中的下一個組件5、卡片布局管理器CardLayout616、空布局不使用任何布局管理器,一般不使用該方式空布局的使用創(chuàng)立容器對象

JPanelpanel=newJPanel();設置容器對象的布局為null

panel.setLayout(null);設置組件在容器中的位置

組件對象.setBounds(x,y,width,height);向容器中添加組件對象(設組件對象已創(chuàng)立)

panel.add(組件對象);62使用布局管理器的根本規(guī)那么(1)假設組件盡量充滿容器空間,可以考慮使用BorderLayout和GridBagLayout。(2)假設用戶需要在緊湊的一行中以組件的自然尺寸顯示較少的組件,用戶可以考慮用面板容納組件,并使用面板的默認布局管理器FlowLayout。(3)假設用戶需要在多行或多列中顯示一些同樣尺寸的組件,GridLayout最適合此情況。(4)假設界面較為復雜,可先使用面板來容納組件,然后選用適當?shù)牟季止芾砥鳌?3布局管理器嵌套實際上是容器的嵌套,被嵌套的容器可以具有不同的布局管理器在嵌套的布局管理器中JPanel通常起到了“橋”的作用64例:復雜GUI的布局65例:實現(xiàn)GUI的步驟分析panel1panel2panel3panel5panel4panel6panel8panel766GUI的設計步驟先設計一個窗口,如JFrame確定布局管理器在窗口中添加所需組件增加事件處理67事件處理模型GUI是由事件(event)驅動的當用戶與GUI交互可以產生事件(events)一些常見的交互方式移動鼠標用鼠標點擊按鈕在文本框中輸入數(shù)據(jù)關閉窗口等68事件處理!用戶交互事件如:單擊鼠標如:按下/釋放鼠標按鈕對象狀態(tài)改變調用事件處理確定發(fā)生的事件的類型確定生成的事件的組件編寫適宜的代碼處理事件事件作用于對象。對象識別事件并做出響應,不同的對象能識別的事件不全相同??梢葬槍ο鄳氖录帉懴鄳拇a,在事件發(fā)生時,程序執(zhí)行事件里的代碼。69事件處理模型

源對象監(jiān)聽器事件

傳播事件的實例方法傳遞途徑代理事件模型Swing中的GUI組件適配器對象事件源:產生事件的組件叫事件源。事件對象:描述系統(tǒng)中發(fā)生了什么的對象事件監(jiān)聽器:對事件進行處理的類。事件對象事件監(jiān)聽器事件源事件處理機制71事件處理機制事件源可供用戶進行交互的GUI組件事件對象封裝了包含所發(fā)生的各種事件的有效信息信息包括:事件源的引用、以及事件監(jiān)聽器在處理事件時所需要的其它各種信息事件信息被包含在類AWTEvent或其子類的實例對象中事件監(jiān)聽器接受事件對象,并處理事件對象72事件處理機制包含事件處理的程序應該包括以下四局部內容:1、引入系統(tǒng)事件類包,如importjava.awt.event.*。2、在事件處理類的聲明中指定要實現(xiàn)的監(jiān)聽器名,如:publicclassMyClassimplementsActionListener{…}3、注冊事件源對象的事件監(jiān)聽者,如btn.addActionListener(this)。4、實現(xiàn)監(jiān)聽器中的接口如實現(xiàn)按鈕事件監(jiān)聽接口ActionListener:publicvoidactionPerformed(ActionEvente){ ...//響應某個動作的代碼...}73事件分類與監(jiān)聽器接口1、事件分類

ActionEventAdjustmentEventComponentEventItemEventTextEvent…ContainerEventFocusEventWindowEventPaintEventInputEventMouseEventKeyEvent742、監(jiān)聽器接口對于每種類型的事件,都定義了相應的事件處理接口;XXXEvent對應的事件處理接口通常為XXXListener。

ActionListenerItemListenerWindowListenerKeyListenerMouseListenerMouseMotionListener…75事件接口及處理方法

76事件接口及處理方法〔續(xù)〕77例:按鈕事件的例如(方法1)importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestJButtonimplementsActionListener{publicTestJButton(){JFramef=newJFrame("TestButtonEvent!");Containerc=f.getContentPane();JButtonb=newJButton("PressMe!");

b.addActionListener(this);c.add(b,"Center");f.setSize(200,100);f.setVisible(true);}publicvoidactionPerformed(ActionEvente){System.out.println("Actionoccurred");System.out.println("Button’slabelis:"+e.getActionCommand());}publicstaticvoidmain(Stringargs[]){newTestJButton();}}方法1:采用同一個類中實現(xiàn)事件接口的方法78例:按鈕事件的例如(方法2)importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestJButtonDemo{publicTestJButtonDemo(){JFramef=newJFrame("TestButtonEvent!");Containerc=f.getContentPane();JButtonb=newJButton("PressMe!");

b.addActionListener(newButtonHandler());c.add(b,"Center");f.setSize(200,100);f.setVisible(true);}publicstaticvoidmain(Stringargs[]){newTestJButtonDemo();}}79例:按鈕事件的例如(方法2)importjava.awt.event.*;publicclassButtonHandlerimplementsActionListener{publicvoidactionPerformed(ActionEvente){System.out.println("Actionoccurred");System.out.println("Button’slabelis:"+e.getActionCommand());}}方法2:采用另一個類中實現(xiàn)事件接口的方法80例:按鈕事件的例如(方法3)importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestInnerButtonDemo{publicTestInnerButtonDemo(){JFramef=newJFrame("TestButtonEvent!");Containerc=f.getContentPane();JButtonb=newJButton("PressMe!");

b.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){System.out.println("Actionoccurred");System.out.println("Button’slabelis:"+e.getActionCommand());}});c.add(b,"Center");f.setSize(200,100);f.setVisible(true);}publicstaticvoidmain(Stringargs[]){newTestInnerButtonDemo();}}方法3:采用匿名內部類實現(xiàn)事件接口的方法81如何監(jiān)聽多個組件事件?例:編寫一個允許學生在文本字段中輸入一個數(shù)的程序。創(chuàng)立一個每當用戶單擊一次就將此數(shù)加一的按鈕。創(chuàng)立另一個每當用戶單擊一次就將此數(shù)減一的按鈕。界面效果如以下圖所示。82importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;classIncrementorimplementsActionListener{JTextFieldnumberTxf;JButtonincrementBtn,decrementBtn;publicvoidmakeGUI(){JFramefrm=newJFrame("Incrementor");Containerc=frm.getContentPane();c.setLayout(newFlowLayout());numberTxf=newJTextField("0",5);c.add(numberTxf);incrementBtn=newJButton("Increment");c.add(incrementBtn);

incrementBtn.addActionListener(this);decrementBtn=newJButton("Decrement");c.add(decrementBtn);

decrementBtn.addActionListener(this);frm.setSize(300,100);frm.setVisible(true);}83publicvoidactionPerformed(ActionEvente){intoldNum=Integer.parseInt(numberTxf.getText());intnewNum=oldNum;if(e.getActionCommand().equals("Increment")){newNum++;}elseif(e.getActionCommand().equals("Decrement")){newNum--;}numberTxf.setText(String.valueOf(newNum));}publicstaticvoidmain(Stringargs[]){Incrementori=newIncrementor();i.makeGUI();}}if(e.getSource()==incrementBtn){elseif(e.getSource()==decrementBtn){84事件適配器類

Java中為那些具有多個方法的監(jiān)聽者接口提供了事件適配器類,這個類通常命名為XxxAdapter,在該類中以空方法體實現(xiàn)了相應接口的所有方法;可通過繼承適配器類來編寫監(jiān)聽者類,在類中只需給出關心的方法,從而減輕工作量。85事件接口與適配器類86事件接口與方法目錄事件適配器類(Adapter)只實現(xiàn)接口所需要處理的方法通過覆蓋對于接口中的其它方法:系統(tǒng)會提供默認的方法(方法體為空)事件適配器類與事件監(jiān)聽器接口的區(qū)別?利用事件適配器類,只需實現(xiàn)所需處理的方法利用事件監(jiān)聽器接口,必須實現(xiàn)所有的方法事件適配器類88案例基于Swing編寫一個用戶登錄的界面程序,用戶類型分為學生用戶和教師用戶,如以下圖所示。如果用戶輸入為空,那么給出“用戶名不可為空”的提示信息,假設是教師用戶,輸入的用戶名和密碼都是teacher,那么顯示“教師用戶登錄成功”的提示信息;假設是學生用戶,輸入的用戶名和密碼都是student,那么顯示“學生用戶登錄成功”的提示信息;否那么顯示“用戶名不存在或者密碼不正確”。importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassSwingUserLoginextendsJFrameimplementsActionListener,ItemListener{ JPanelpanel1,panel2; JLabelUserType,UserLabel,PasswordLabel; JTextFieldUserTextField; JPasswordFieldPasswordTextField; JButtonYesBtn,CancelBtn,ExitBtn; JComboBoxUserSelect; Stringuser[]={"學生用戶","教師用戶","管理員"}; Containerc; inti=0;

publicSwingUserLogin(){ super("用戶登錄"); UserType=newJLabel("用戶類型",JLabel.CENTER); UserSelect=newJComboBox(user); UserSelect.addItemListener(this);UserLabel=newJLabel("用戶名:",JLabel.CENTER); PasswordLabel=newJLabel("密碼:",JLabel.CENTER); UserTextField=newJTextField(10); PasswordTextField=newJPasswordField(10); YesBtn=newJButton("確定"); CancelBtn=newJButton("取消"); ExitBtn=newJButton("退出"); YesBtn.addActionListener(this); CancelBtn.addActionListener(this); ExitBtn.addActionListener(this); panel1=newJPanel();

溫馨提示

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

評論

0/150

提交評論