《Java概述》課件-chapter09 GUI組件和設(shè)計(jì)_第1頁
《Java概述》課件-chapter09 GUI組件和設(shè)計(jì)_第2頁
《Java概述》課件-chapter09 GUI組件和設(shè)計(jì)_第3頁
《Java概述》課件-chapter09 GUI組件和設(shè)計(jì)_第4頁
《Java概述》課件-chapter09 GUI組件和設(shè)計(jì)_第5頁
已閱讀5頁,還剩155頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第九章

GUI組件和用戶界面設(shè)計(jì)

教學(xué)目標(biāo)9.1AWT和Swing組件概述9.2事件處理模型9.3命令按鈕JButton9.4標(biāo)簽、單行文本框、多行文本域與滾動(dòng)條面板9.5復(fù)選框按鈕JCheckBox和單選按鈕JRadioButton9.6組合框JComboBox9.7列表JList9.8布局管理器教學(xué)目標(biāo)(續(xù))9.9面板JPanel和窗口9.10鼠標(biāo)事件處理9.11適配器類9.12鍵盤事件處理9.13菜單

9.13.1主菜單

9.13.2彈出式菜單9.14選項(xiàng)卡面板JTabbedPane9.1Swing和AWT組件概述

圖形用戶界面GUI(GraphicalUserInterfaces),給用戶提供了一個(gè)交互式的直觀圖形化操作界面。提供了程序的外觀和感覺每個(gè)Java程序利用GUI圖形用戶界面接受用戶的輸入,向用戶輸出程序運(yùn)行的結(jié)果。menubarbuttoncomboboxmenusscrollbars9.1AWT和Swing組件概述Java語言中,為了方便圖形用戶界面的開發(fā),設(shè)計(jì)了專門的類庫來生成各種標(biāo)準(zhǔn)圖形界面元素和處理圖形界面的各種事件。用來生成圖形用戶界面的類庫:java.awt包。AWT(abstractwindowtoolkit,抽象窗口工具集)javax.swing包1、AWT組件介紹java.awt包提供了基本的Java程序的GUI設(shè)計(jì)工具,包中的主要類或接口之間的繼承關(guān)系:

ObjectLayoutManagerComponentLabelWindowButtonCanvasCheckboxContainerPanelDialogAppletFrame1、AWT組件介紹(1)組件Component

組件是一個(gè)以圖形化的方式顯示在屏幕上并能與用戶進(jìn)行交互的對(duì)象,例如Button、Label,組件通常被放在容器中。Component類是抽象類,定義了所有組件所具有的通用特性和行為,并派生出其他所有的組件。Compoment類提供的功能:基本的繪畫支持。方法repaint()、paint()、update()等用來在屏幕上繪制組件.外形控制。包括字體、顏色等。相應(yīng)的方法有:getFont()、setFont()、setBackground()、SetForeground()等大小和位置控制。方法有:setSize()、setLocation()等。圖像處理。類Component實(shí)現(xiàn)了接口ImageObserver,其中的方法imageUpdate()用來進(jìn)行圖像跟蹤。組件的狀態(tài)控制。例如:setEnable()控制組件是否接收用戶的輸入,isEnable(),isVisible()、isValid()返回組件的狀態(tài)。

1、AWT組件介紹(3)布局管理器LayoutManager布局管理器管理組件在容器中的布局方式。布局管理器類都實(shí)現(xiàn)了接口LayoutManager。Java系統(tǒng)提供的標(biāo)準(zhǔn)布局管理器類:FlowLayoutBorderLayoutGridLayoutCardLayoutBoxLayoutGridBagLayout1、AWT組件介紹(2)容器Container容器是Component的子類,它具有組件的所有性質(zhì),同時(shí)又具有容納其它組件和容器的功能。每個(gè)容器add()方法向容器添加某個(gè)組件,remove()方法從容器中刪除某個(gè)組件。每個(gè)容器都與一個(gè)布局管理器相聯(lián),以確定容器內(nèi)組件的布局方式。容器通過方法setLayout()設(shè)置某種布局。

2.Swing介紹Swing組件在javax.swing包中。其特點(diǎn):(1)Swing組件是用100%純Java代碼實(shí)現(xiàn)的輕量級(jí)(light-weight)組件.沒有本地代碼,不依賴操作系統(tǒng)的支持,這是它與重量級(jí)組件AWT的最大區(qū)別。Swing比AWT組件具有更強(qiáng)的實(shí)用性和美觀性。

2.Swing介紹(2)Swing組件的多樣化

Swing是AWT的擴(kuò)展,Swing組件以“J”開頭.有與AWT類似的按鈕(JButton)、標(biāo)簽(JLabel)、復(fù)選框(JCheckBox)、菜單(JMenu)等基本組件外,增加了一個(gè)豐富的高層組件集合,如表格(JTable)、樹(JTree)。大多數(shù)Swing組件從JComponent類繼承JComponent是一個(gè)抽象類:定義所有子類組件的一般方法,如:使用setBorder()方法:設(shè)置組件外圍的邊框;使用setTooltipText()方法:為組件設(shè)置對(duì)用戶有幫助的提示信息。

Swing組件的繼承的超類ObjectComponentContainerJComponentObjectComponentJComponentContainer2.Swing介紹(3)可插入的外觀感覺

Swing使得程序在一個(gè)平臺(tái)上運(yùn)行時(shí)能夠有不同的外觀。3.Swing組件的分類從功能上分:(1)頂層容器:JFrame,JApplet,JDialog,JWindow共4個(gè)(2)普通容器:JPanel,JScrollPane,JSplitPane,JToolBar(3)特殊容器:在GUI上起特殊作用的中間層JInternalFrame,JLayeredPane,JRootPane.(4)基本控件:實(shí)現(xiàn)人際交互的組件,如JButton,JComboBox,JList,JMenu,JSlider,JTextField(5)向用戶顯示不可編輯信息的組件.例如JLabel,JProgressBar,ToolTip(6)向用戶顯示能被編輯的格式化信息的組件.如JColorChooser,JFileChooser,JTable,JTextArea4.使用Swing的基本規(guī)則與AWT組件不同,Swing組件不能直接添加到頂層容器中,它必須添加到一個(gè)與Swing頂層容器相關(guān)聯(lián)的內(nèi)容面板(contentpane)上。例如,對(duì)JFrame頂層容器而言,添加組件有兩種方式:方式1:用getContentPane()方法獲得JFrame的內(nèi)容面板,再對(duì)其加入組件:

frame.getContentPane().add(childComponent);方式2:建立一個(gè)JPanel或

JDesktopPane之類的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置為JFrame的內(nèi)容面板:

JPanelcontentPane=newJPanel();

……//把其它組件添加到JPanel中;

frame.setContentPane(contentPane);

把contentPane對(duì)象設(shè)置為frame的內(nèi)容面板9.2事件處理模型Java的圖形用戶界面是事件驅(qū)動(dòng)的:當(dāng)用戶與GUI組件交互時(shí)會(huì)引發(fā)一個(gè)系統(tǒng)預(yù)先定義好的事件。一些常見的事件:鼠標(biāo)移動(dòng)、單擊鼠標(biāo)按鈕、鼠標(biāo)單擊按鈕button、在文本框中進(jìn)行輸入、在菜單中選擇菜單項(xiàng)、關(guān)閉窗口等。GUI事件對(duì)象:從java.awt.event.AWTEvent類繼承java.awt.event包中的事件類ObjectEventObjectAWTEventActionEventAdjustmentEventItemEventTextEventContainerEventFocusEventPaintEventWindowEventInputEventMouseWheelEventComponentEventKeyEventMouseEvent9.2事件處理模型1.Java的事件處理模型由三部分組成:

事件源(Eventsource):是用戶交互的各種GUI組件。

事件對(duì)象(Eventobject):封裝了發(fā)生事件的有關(guān)信息。

事件監(jiān)聽器(Eventlistener):當(dāng)事件發(fā)生時(shí)被通知到接受事件的事件監(jiān)聽對(duì)象,然后調(diào)用事件監(jiān)聽對(duì)象中對(duì)應(yīng)的方法響應(yīng)該事件。一個(gè)事件監(jiān)聽對(duì)象是實(shí)現(xiàn)了系統(tǒng)規(guī)定的事件監(jiān)聽接口的類的對(duì)象。事件監(jiān)聽接口中提供了事件處理的抽象方法的描述。圖9-4Java系統(tǒng)的事件監(jiān)聽接口java.awt.event包定義了Java系統(tǒng)的一組事件監(jiān)聽接口類型,一個(gè)監(jiān)聽接口往往聲明了一個(gè)以上的抽象方法。每個(gè)抽象方法對(duì)應(yīng)著要處理的事件動(dòng)作,由用戶實(shí)現(xiàn)它。

EventListenerActionListenerAdjustmentListenerComponentListenerContainerListenerFocusListenerItemListenerKeyListenerMouseListenerMouseMotionListenerTextListenerWindowListener9.2事件處理模型2.當(dāng)需要對(duì)組件的某種事件進(jìn)行響應(yīng)和處理時(shí),程序員必須完成兩個(gè)步驟:為組件注冊(cè)實(shí)現(xiàn)規(guī)定接口的事件監(jiān)聽器;

實(shí)現(xiàn)事件監(jiān)聽器接口中聲明的事件處理抽象方法。例如,button組件的事件響應(yīng)過程:JButtonbutton=newJButton("Press");//(1)為button組件注冊(cè)事件監(jiān)聽器button.addActionListener(newButtonHandler());Class

ButtonHandlerimplements

ActionListener{//實(shí)現(xiàn)事件監(jiān)聽接口的類

publicvoidactionPerformed(ActionEventevent)//(2)實(shí)現(xiàn)事件處理方法。{…//事件處理代碼}}

鼠標(biāo)單擊,觸發(fā)事件ActionEvent將調(diào)用方法actionPerformed9.2事件處理模型3.ActionEvent動(dòng)作事件

ActionEvent:當(dāng)特定組件(例如Button)的動(dòng)作(例如點(diǎn)擊按鈕)發(fā)生時(shí),由組件生成此動(dòng)作事件。該事件被傳遞給使用組件的addActionListener方法注冊(cè)的每一個(gè)ActionListener對(duì)象,用以接收這類事件.能夠觸發(fā)這個(gè)事件的動(dòng)作,主要包括:(1)點(diǎn)擊按鈕(2)雙擊一個(gè)列表中的選項(xiàng);(3)選擇菜單項(xiàng);(4)在文本框中輸入回車。

9.2事件處理模型ActionEvent事件常用的一些方法:(1)StringgetActionCommand():返回引發(fā)事件的動(dòng)作的命令字符串。例如,對(duì)于Button按鈕返回的是Button的標(biāo)簽。對(duì)于JTextField返回的是文本內(nèi)容。(2)StringgetSource():返回引發(fā)該事件的組件對(duì)象(事件源)的引用。使用getSource()方法可以區(qū)分產(chǎn)生動(dòng)作命令的不同事件源下面將介紹各個(gè)GUI組件時(shí)將結(jié)合相應(yīng)的事件類型和事件監(jiān)聽器接口類型進(jìn)行程序設(shè)計(jì)的過程。9.3命令按鈕JButton

命令按鈕(JButton)是一種組件,當(dāng)用戶通過單擊按鈕時(shí)將產(chǎn)生動(dòng)作事件ActionEvent,以觸發(fā)特定的動(dòng)作代碼,從而完成預(yù)先指定的功能。Swing中JButton既支持文本按鈕,也支持圖像按鈕,或兩者兼有。

9.3命令按鈕JButton1.創(chuàng)建按鈕對(duì)象JButton類常用的一組構(gòu)造方法:(1)

JButton(Stringtext):創(chuàng)建一個(gè)帶文本的按鈕。(2)

JButton(Iconicon):創(chuàng)建一個(gè)帶圖標(biāo)的按鈕。(3)JButton(Stringtext,Iconicon):創(chuàng)建一個(gè)帶文本和圖標(biāo)的按鈕。2.按鈕對(duì)象的常用方法

getLabel():返回按鈕的標(biāo)簽字符串;②

setLabel(Strings):設(shè)置按鈕的標(biāo)簽為字符串s。

9.3命令按鈕JButton3.ActionEvent事件響應(yīng)當(dāng)用戶單擊一個(gè)按鈕時(shí)就引發(fā)了一個(gè)動(dòng)作事件ActionEvent。調(diào)用JButton的方法addActionListener給按鈕注冊(cè)實(shí)現(xiàn)ActionListener接口的事件監(jiān)聽器為這個(gè)接口的actionPerformed(ActionEvente)方法編寫方法體。e.getSource():獲取引發(fā)動(dòng)作事件的按鈕對(duì)象引用e.getActionCommand():獲取按鈕的標(biāo)簽。9.3命令按鈕JButton例9-1文本按鈕和圖像按鈕的程序設(shè)計(jì)示例

importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassButtonTestextendsJFrame{privateJButtonplainButton,fancyButton;publicButtonTest()//setupGUI{super("JButton的程序設(shè)計(jì)");Containercontainer=getContentPane();container.setLayout(newFlowLayout());plainButton=newJButton("文本按鈕");container.add(plainButton);

Iconbug1=newImageIcon(getClass().getResource("bug1.gif"));Iconbug2=newImageIcon(getClass().getResource("bug2.gif"));fancyButton=newJButton("文本圖像按鈕",bug1);fancyButton.setRolloverIcon(bug2);container.add(fancyButton);ButtonHandlerhandler=newButtonHandler();fancyButton.addActionListener(handler);plainButton.addActionListener(handler);

fancyButton的默任圖標(biāo)bug1當(dāng)鼠標(biāo)置于該按鈕上時(shí),顯示圖標(biāo)bug2為button事件處理創(chuàng)建類ButtonHandler的對(duì)象setSize(275,100);setVisible(true);}//endButtonTestconstructorpublicstaticvoidmain(Stringargs[]){ButtonTestapplication=newButtonTest();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}

//innerclassforbuttoneventhandlingprivateclassButtonHandlerimplementsActionListener{

//handlebuttoneventpublicvoidactionPerformed(ActionEventevent){JOptionPane.showMessageDialog(ButtonTest.this,"你按下的是:"+event.getActionCommand());}}}9.4標(biāo)簽、單行文本框、多行文本域

與滾動(dòng)條面板

搭建GUI圖形界面使用最多的Swing組件:標(biāo)簽(JLabel)、單行文本框(JTextField、JTextPassword)多行文本域(JTextArea)滾動(dòng)條面板(JScrollPane)9.4.1標(biāo)簽JLabel

JLabel標(biāo)簽是用戶不能修改只能查看其內(nèi)容的文本顯示區(qū)域,它起到信息說明的作用。JLabel對(duì)象可以顯示文本和圖像。9.4.1標(biāo)簽JLabel使用JLabel類的構(gòu)造方法創(chuàng)建標(biāo)簽對(duì)象。

JLabel類常用的構(gòu)造方法有:

(1)JLabel(String

text)

(2)JLabel(Icon

image)

(3)JLabel(String

textint

horizontalAlignment)

水平對(duì)齊方式HorizontalAlignment值:SwingConstants接口中靜態(tài)常量:LEFT、CENTER、RIGHT、LEADING或TRAILING。

(4)JLabel(String

text,Icon

icon,int

horizontalAlignment)

創(chuàng)建具有指定文本、圖像和水平對(duì)齊方式的JLabel對(duì)象,該標(biāo)簽在其顯示區(qū)內(nèi)垂直居中對(duì)齊。文本位于圖像的結(jié)尾。9.4.1標(biāo)簽JLabel設(shè)置或讀取JLabel對(duì)象屬性的常用方法:(1)設(shè)置或讀取JLabel顯示的文本。

setText(Stringtext)、

StringgetText():(2)設(shè)置或讀取JLabel顯示的圖像:setIcon(Icon

image)、getIcon()(3)設(shè)置JLabel顯示文本的前景色和背景色。

setForeground(Colorc)setBackground(Colorc):(4)設(shè)置JLabel顯示的文本字體:

setFont(Fontf):。

9.4.1標(biāo)簽JLabel例如:創(chuàng)建文本內(nèi)容是“文本標(biāo)簽”且顏色是紅色的JLabel實(shí)例的語句:

label1=newJLabel(“用戶名");label1.setColor(Color.RED);

例:創(chuàng)建文本內(nèi)容為“照片”,圖像是czims.jpg,且整個(gè)標(biāo)簽水平靠左對(duì)齊的JLabel實(shí)例語句:

Iconbug=newImageIcon(getClass().getResource("czims.jpg");label2=newJLabel(“照片",bug,SwingConstants.LEFT);

//設(shè)置label2的文本相對(duì)于圖片的位置:水平方向居中對(duì)齊,垂直方向在圖片的底部

label2.setHorizontalTextPosition(SwingConstants.CENTER);label2.setVerticalTextPosition(SwingConstants.BOTTOM);

9.4.2JTextField與JTextArea從JTextComponent父類派生單行文本框JTextField、JPasswordField

允許編輯單行文本,JTextField顯示用戶輸入的內(nèi)容,JPasswordField隱藏用戶實(shí)際輸入的內(nèi)容。多行文本域JTextArea

允許用戶編輯多行文本。滾動(dòng)條面板JScrollPane

:提供JTextArea內(nèi)容水平滾動(dòng)和縱向滾動(dòng)。

1.JTextField和JPasswordFieldJTxtField常用的構(gòu)造方法:(1)JTextField():構(gòu)造一個(gè)內(nèi)容為空的JTextField實(shí)例。(2)JTextField(intcolumns):構(gòu)造一個(gè)內(nèi)容為空和指定列寬

的JTextField實(shí)例。(3)JTextField(Stringtext):構(gòu)造一個(gè)用指定文本的JTextField實(shí)例。(4)JTextField(Stringtext,intcolumns):構(gòu)造一個(gè)指定文本和列寬的JTextField實(shí)例。

JPassword類的構(gòu)造方法類似于JTextField.9.4.2JTextField與JTextArea3.JTextComponent對(duì)象的常用方法:voidsetText(String)設(shè)置文本內(nèi)容

StringgetText()

取得文本內(nèi)容② voidsetEditable(booleanb)

設(shè)置TextComponent是否為可編輯的(b值為true時(shí))。③ StringgetSelectedText()

返回TextComponent中包含的選定文本。9.4.2JTextField與JTextArea4.TextEvent和ActionEvent事件響應(yīng)JTextField和JTextArea的事件響應(yīng)首先由它們的父類JTextComponent決定TextComponent引發(fā)事件TextEvent當(dāng)用戶對(duì)文本做編輯修改操作時(shí),將引發(fā)TextEvent文本改變事件。JTextField比JTextArea多產(chǎn)生一種事件ActionEvent當(dāng)用戶在文本框中按回車鍵時(shí),將引發(fā)ActionEvent動(dòng)作事件。JTextArea卻不能產(chǎn)生ActionEvent事件.9.4.3滾動(dòng)條面板JScrollPane

JScrollPane是帶滾動(dòng)條的面板。它是一個(gè)容器組件,其作用是通過滾動(dòng)條在一個(gè)較小的區(qū)域顯示較多大的內(nèi)容。

JScrollPane的構(gòu)造方法:JScrollPane(Componentview):

創(chuàng)建一個(gè)顯示指定組件內(nèi)容的JScrollPane,只要組件的內(nèi)容超過視圖大小就會(huì)顯示水平和垂直滾動(dòng)條。

例9-2JLabel、JTextField、JPasswordField和JTextArea的應(yīng)用。程序運(yùn)行輸出結(jié)果如圖9-7。程序的功能:(1)當(dāng)用戶分別在用戶名和口令的文本框中輸入內(nèi)容按回車鍵后,將在標(biāo)簽為“顯示用戶名或口令”的文本框中顯示用戶輸入的內(nèi)容。(2)在圖的下半部分定義了一個(gè)水平方向的Box對(duì)象,加入Box的組件按水平方向排列。在Box對(duì)象中加入了三個(gè)GUI組件:兩個(gè)JTextArea和一個(gè)JButton。用戶可通過鼠標(biāo)選擇左邊的textArea1的內(nèi)容,然后鼠標(biāo)單擊標(biāo)簽為“拷貝”按鈕,會(huì)將選中的textArea1的內(nèi)容拷貝到右邊JScrollPane中。兩個(gè)JTextArea對(duì)象分別放入兩個(gè)JScrollPane滾動(dòng)條面板對(duì)象中.

importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassLabelandTextTestextendsJFrame{privateJTextFieldtextField1,textField3;privateJTextAreatextArea1,textArea2;privateJPasswordFieldpasswordField;privateJButtoncopyButton;publicLabelandTextTest()//setupGUI{super("JTextField,JPasswordField和JTextArea的使用");Containercontainer=getContentPane();container.setLayout(newFlowLayout());JLabellabel1=newJLabel("用戶名:");container.add(label1);textField1=newJTextField(10);container.add(textField1);container.add(newJLabel("口令:"));passwordField=newJPasswordField(10);container.add(passwordField);Iconbug=newImageIcon("czims.jpg");JLabellabel2=newJLabel("照片:",bug,SwingConstants.LEFT);label2.setHorizontalTextPosition(SwingConstants.CENTER);label2.setVerticalTextPosition(SwingConstants.BOTTOM);container.add(label2);textField3=newJTextField("顯示用戶名或口令",30);textField3.setEditable(false);container.add(textField3);//registereventhandlersTextFieldHandlerhandler=newTextFieldHandler();textField1.addActionListener(handler);passwordField.addActionListener(handler);Boxbox=Box.createHorizontalBox();Stringstring="Thisisademostringto\n"+"illustratetextareaprogramming\n";textArea1=newJTextArea(string,5,12);box.add(newJScrollPane(textArea1));copyButton=newJButton("拷貝>>>");box.add(copyButton);copyButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){textArea2.setText(textArea1.getSelectedText());}});textArea2=newJTextArea(5,12);textArea2.setEditable(false);box.add(newJScrollPane(textArea2));container.add(box);setSize(500,400);setVisible(true);}publicstaticvoidmain(Stringargs[]){LabelandTextTestapplication=newLabelandTextTest();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//privateinnerclassforeventhandlingfortwoTextFieldsprivateclassTextFieldHandlerimplementsActionListener{publicvoidactionPerformed(ActionEventevent){Stringstring="";if(event.getSource()==textField1)string="textField1:"+event.getActionCommand();elseif(event.getSource()==passwordField){string="passwordField:"+newString(passwordField.getPassword());}textField3.setText(string);}}//endprivateinnerclassTextFieldHandler}9.5JCheckBox和JRadioButton

SwingGUI組件包含3種類型的狀態(tài)按鈕:JToggleButton復(fù)選框按鈕JCheckBox和單選按鈕JRadioButton按鈕都有開/關(guān)(真/假)兩種值。提供用戶在給定的數(shù)據(jù)中進(jìn)行選擇.

Swingbutton的繼承層次JComponentAbstractButtonJToggleButtonJRadioButtonJCheckBoxJButton1.復(fù)選框(JCheckBox)JCheckBox提供簡單的“on/off”開關(guān),旁邊顯示文本標(biāo)簽。它只有兩種狀態(tài):選中和未選中。在一組復(fù)選框中,可以同時(shí)選擇多項(xiàng)。1.復(fù)選框(JCheckBox)復(fù)選框的常用的構(gòu)造方法:(1)

JCheckBox(Stringtext)(2)JCheckBox(Stringtext,booleanselected)(3)

JCheckBox(Iconicon,booleanselected)(4)

JCheckBox(Stringtext,Iconicon,booleanselected)

創(chuàng)建一個(gè)帶文本和圖標(biāo)的復(fù)選框,并指定其最初是否處于選定狀態(tài)。

JCheckBoxbold=newJCheckBox("Bold",true);JCheckBoxitalic=newJCheckBox("Italic");2.單選按鈕(JRadioButton)單選按鈕(JRadioButton)與復(fù)選框一樣也只有兩種狀態(tài):選中和未選中。

2.單選按鈕(JRadioButton)JRadioButton的常用的構(gòu)造方法:(1)JRadioButton(Stringtext)(2)JRadioButton(Stringtext,booleanselected):(3)JRadioButton(Iconicon)(4)RadioButton(Stringtext,Iconicon,booleanselected)

創(chuàng)建一個(gè)具有指定的文本、圖像和選擇狀態(tài)的單選按鈕。

單選按鈕與ButtonGroup對(duì)象配合使用,可創(chuàng)建一組單選按鈕,用戶一次只能選擇其中的一個(gè)。.2.單選按鈕(JRadioButton)例如:創(chuàng)建性別的兩個(gè)單選按鈕對(duì)象并用ButtonGroup對(duì)象邏輯上分為一組.maleButton=newJRadioButton("男",true);womenButton=newJRadioButton("女",false);radioGroup=newButtonGroup();radioGroup.add(maleButton);//兩個(gè)單選按鈕邏輯上分為一組

radioGroup.add(womenButton);Containercontainer=getContentPane();//將兩個(gè)JRadioButton對(duì)象加入面板容器中

container.add(maleButton);container.add(womenButton);9.5JCheckBox和JRadioButton(1)booleanisSelected():返回復(fù)選框的狀態(tài),是否被選中。(2)voidsetSelected(boolean):設(shè)置復(fù)選框是否被選中。

3.復(fù)選框或單選按鈕對(duì)象的常用方法9.5JCheckBox和JRadioButtonItemEvent事件響應(yīng)

當(dāng)用戶點(diǎn)擊復(fù)選框或單選按鈕)使其狀態(tài)發(fā)生變化時(shí)就會(huì)引發(fā)ItemEvent事件。用addItemListener()方法給復(fù)選框或單選按鈕組件注冊(cè)實(shí)現(xiàn)ItemListener接口的事件監(jiān)聽器實(shí)現(xiàn)接口中的抽象方法.voiditemStateChanged(ItemEventevent)例如,使用匿名內(nèi)部類的復(fù)選框的事件監(jiān)聽的程序結(jié)構(gòu):復(fù)選框?qū)ο?addItemListener(newItemListener(){publicvoiditemStateChanged(ItemEventevent){

…}});9.5JCheckBox和JRadioButtonItemEvent類的事件對(duì)象的方法:(1)intgetStateChange()

獲得當(dāng)前復(fù)選框(或單選按鈕)的狀態(tài)值。返回:ItemEvent.DESELECTED或者ItemEvent.SELECTED;(2)ObjectgetItem()

得到當(dāng)前復(fù)選框?qū)ο螅ɑ騿芜x按鈕)的引用。9.5JCheckBox和JRadioButton例9-3復(fù)選框的應(yīng)用。利用兩個(gè)復(fù)選框的選中/未選中狀態(tài),控制一個(gè)JTextField的顯示文本的字體風(fēng)格變化。程序運(yùn)行輸出結(jié)果如圖9-9。

importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassCheckBoxTestextendsJFrame{privateJTextFieldfield;privateJCheckBoxbold,italic;publicCheckBoxTest(){super("JCheckBox的應(yīng)用");Containercontainer=getContentPane();container.setLayout(newFlowLayout());//setupJTextFieldandsetitsfontandcolorfield=newJTextField("點(diǎn)擊復(fù)選框,請(qǐng)觀察字體風(fēng)格的變化",22);field.setFont(newFont("Serif",Font.PLAIN,14));field.setForeground(Color.red);container.add(field);//createcheckboxobjectsbold=newJCheckBox("Bold");container.add(bold);italic=newJCheckBox("Italic");container.add(italic);//registerlistenersfortwoJCheckBoxesCheckBoxHandlerhandler=newCheckBoxHandler();bold.addItemListener(handler);italic.addItemListener(handler);setSize(275,100);setVisible(true);}publicstaticvoidmain(Stringargs[]){CheckBoxTestapplication=newCheckBoxTest();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//privateinnerclassforItemListenereventhandlingprivateclassCheckBoxHandlerimplementsItemListener{privateintvalBold=Font.PLAIN;privateintvalItalic=Font.PLAIN;publicvoiditemStateChanged(ItemEventevent){if(event.getSource()==bold)valBold=bold.isSelected()?Font.BOLD:Font.PLAIN;if(event.getSource()==italic)valItalic=italic.isSelected()?Font.ITALIC:Font.PLAIN;field.setFont(newFont("Serif",valBold+valItalic,14));}}}9.5JCheckBox和JRadioButton例9-4創(chuàng)建兩個(gè)單選按鈕對(duì)象,使用ButtonGroup對(duì)象進(jìn)行邏輯分組。程序用兩個(gè)單選按鈕提供性別值的選擇,規(guī)定一次只能選擇一個(gè)單選按鈕。importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassRadioButtonTestextendsJFrame{privateJTextFieldfield;privateJRadioButtonmaleButton,womenButton;privateButtonGroupradioGroup;publicRadioButtonTest(){super("RadioButtonTest");Containercontainer=getContentPane();container.setLayout(newFlowLayout());JLabellabel1=newJLabel("性別:");container.add(label1);maleButton=newJRadioButton("男",true);container.add(maleButton);womenButton=newJRadioButton("女",false);container.add(womenButton);radioGroup=newButtonGroup();radioGroup.add(maleButton);radioGroup.add(womenButton);

//registereventsforJRadioButtonsmaleButton.addItemListener(newRadioButtonHandler());womenButton.addItemListener(newRadioButtonHandler());field=newJTextField("性別初值是:男");container.add(field);setSize(300,100);setVisible(true);}publicstaticvoidmain(Stringargs[]){RadioButtonTestapplication=newRadioButtonTest();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//privateinnerclasstohandleradiobuttoneventsprivateclassRadioButtonHandlerimplementsItemListener{//handleradiobuttoneventspublicvoiditemStateChanged(ItemEventevent){if(event.getItem()==maleButton)field.setText("性別值是:男");elseif(event.getItem()==womenButton)field.setText("性別值是:女");}}}9.6組合框JComboBox

組合框JComboBox也叫下拉菜單,提供用戶可以從下拉菜單列表中選擇值.1.JComboBox類的常用的構(gòu)造方法

JComboBox(Object[]items)

創(chuàng)建包含指定數(shù)組中的元素的

JComboBox。

9.6組合框JComboBox2.JComboBox對(duì)象的常用方法(1)voidsetMaximumRowCount(3)

設(shè)置單擊組合框時(shí)允許顯示的最大列表項(xiàng)數(shù)。如果組合框的列表項(xiàng)數(shù)超過了能顯示的最大數(shù)目,則JComboBox自動(dòng)提供滾動(dòng)條。(2)intgetSelectedIndex()

返回組合框的當(dāng)前所選項(xiàng)的索引值(0—n)。(3)ObjectgetSelectedItem()

返回組合框的當(dāng)前所選項(xiàng)。(4)voidsetEditable(booleanaFlag)

確定JComboBox字段是否可編輯。

9.6組合框JComboBox3.ItemEvent事件響應(yīng)當(dāng)用戶點(diǎn)擊組合框時(shí)就會(huì)引發(fā)ItemEvent事件。調(diào)用組合框組件的方法addItemListener,給組合框注冊(cè)實(shí)現(xiàn)ItemListener接口的事件監(jiān)聽器同時(shí),為接口的抽象方法書寫方法體

voiditemStateChanged(ItemEventevent)

9.6組合框JComboBox例9-5組合框示例程序。用組合框的下拉菜單提供一組圖像,用戶可選擇其中一項(xiàng),將選中的圖像在JLabel組件中顯示。程序運(yùn)行結(jié)果:

importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassComboBoxTestextendsJFrame{privateJComboBoximagesComboBox;privateJLabellabel;privateStringnames[]={"bug1.gif","bug2.gif","travelbug.gif","buganim.gif"};privateIconicons[]=newImageIcon[names.length];publicComboBoxTest(){super("用組合框選擇一組圖像");Containercontainer=getContentPane();container.setLayout(newFlowLayout());imagesComboBox=newJComboBox(names);imagesComboBox.setMaximumRowCount(3);imagesComboBox.addItemListener(newItemListener(){publicvoiditemStateChanged(ItemEventevent){if(event.getStateChange()==ItemEvent.SELECTED)label.setIcon(icons[imagesComboBox.getSelectedIndex()]);}});container.add(imagesComboBox);for(inti=0;i<icons.length;i++)icons[i]=newImageIcon(getClass().getResource(names[i]));label=newJLabel(icons[0]);container.add(label);setSize(350,100);setVisible(true);}publicstaticvoidmain(Stringargs[]){ComboBoxTestapplication=newComboBoxTest();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}9.7列表JList列表(JList):允許用戶從列表中選擇一個(gè)(單選)或選擇多個(gè)(多選)對(duì)象。JList不支持直接滾動(dòng)。要?jiǎng)?chuàng)建一個(gè)帶滾動(dòng)條的列表,需要將一個(gè)JList加入JScrollPane對(duì)象中。

1.JList的常用構(gòu)造方法

JList(Object[]listData)

構(gòu)造一個(gè)JList,使其顯示指定數(shù)組中的元素。

2.JList對(duì)象的常用方法(1)voidsetVisibleRowCount(intvisibleRowCount)

設(shè)置不使用滾動(dòng)條可以在列表中顯示的預(yù)定行數(shù).

9.7列表JList2.JList對(duì)象的常用方法(續(xù))

(2)voidsetSelectionMode(intselectionMode)

確定允許單項(xiàng)選擇還是多項(xiàng)選擇模式。

selectionMode值為:ListSelectionModel.SINGLE_SELECTION:一次只能選擇一個(gè)列表項(xiàng);ListSelectionModel.SINGLE_INTERVAL_SELECTION:一次可選擇多個(gè)連續(xù)的列表項(xiàng);ListSelectionModel.MULTIPLE_INTERVAL_SELECTION(默認(rèn)設(shè)置)對(duì)多項(xiàng)列表選擇沒有限制。

(3)voidsetListData(Object[]listData)

用Object數(shù)組設(shè)置JList的列表內(nèi)容。9.7列表JList2.JList對(duì)象的常用方法(續(xù))

(4)

intgetSelectedIndex()

返回所選的第一個(gè)索引;如果沒有選擇項(xiàng),則返回

-1。(5)

int[]getSelectedIndices()

返回所選的全部列表項(xiàng)索引的數(shù)組(按升序排列)。(6)

ObjectgetSelectedValue()

返回所選的第一個(gè)列表項(xiàng)值。如果選擇為空,則返回

null。(7)Object[]getSelectedValues()

返回所選一組列表項(xiàng)值。9.7列表JList3.ListSelectionEvent事件響應(yīng)當(dāng)用戶在JList中選擇列表項(xiàng)時(shí),將產(chǎn)生ListSelectionEvent事件。調(diào)用列表的方法addListSelectionListener給列表組件組件注冊(cè)實(shí)現(xiàn)ListSelectionListener接口的事件監(jiān)聽器,實(shí)現(xiàn)接口的抽象方法

voidvalueChanged(ListSelectionEventevent)

。例9-6列表的應(yīng)用示例。

程序創(chuàng)建一個(gè)帶滾動(dòng)條的JList列表對(duì)象,JList列表的內(nèi)容是放置了一組顏色。當(dāng)用戶選中列表中某顏色項(xiàng)時(shí),將會(huì)設(shè)置JFrame的背景色。程序運(yùn)行結(jié)果如圖9-11。

importjava.awt.*;importjavax.swing.*;importjavax.swing.event.*;publicclassListTestextendsJFrame{privateJListcolorList;privateContainercontainer;privatefinalStringcolorNames[]={"Black","Blue","Cyan","DarkGray","Gray","Green","LightGray","Magenta","Orange","Pink","Red","White","Yellow"};privatefinalColorcolors[]={Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,Color.LIGHT_GRAY,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE,Color.YELLOW};publicListTest(){super("列表的應(yīng)用");container=getContentPane();container.setLayout(newFlowLayout());colorList=newJList(colorNames);colorList.setVisibleRowCount(5);colorList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);container.add(newJLabel("請(qǐng)選擇顏色,以控制JFrame背景色"));container.add(newJScrollPane(colorList));colorList.addListSelectionListener(newListSelectionListener(){

//handlelistselectioneventspublicvoidvalueChanged(ListSelectionEventevent){container.setBackground(colors[colorList.getSelectedIndex()]);}});//endcalltoaddListSelectionListenersetSize(350,150);setVisible(true);}//endListTestconstructorpublicstaticvoidmain(Stringargs[]){ListTestapplication=newListTest();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}9.8布局管理器

布局管理器用于管理組件在容器中的布局方式。布局管理器類都實(shí)現(xiàn)了接口LayoutManager。

Java提供標(biāo)準(zhǔn)布局管理器類:FlowLayout、BorderLayout、GridLayout、GridBagLayout、CardLayout、和BoxLayout,其中前5個(gè)布局管理器類在java.awt包中,而BoxLayout在javax.swing包中。設(shè)定容器的布局管理器,用Container類的方法:

setLayout(LayoutManagelayoutmanage)JFrame容器的默認(rèn)布局管理器BorderLayoutJPanel和JApplet容器的默認(rèn)布局管理器FlowLayoutgetContentPane()容器的默認(rèn)布局管理器是BorderLayout。

9.8.1FlowLayout布局管理器

FlowLayout提供的布局管理:將組件按加入的順序,將它們從左向右、從上至下(一行放不下,就放入下一行)地放置在容器中,并允許設(shè)定組件的縱橫間隔和水平對(duì)齊方式。FlowLayouts往往用來布局容器中的一組按鈕。FlowLayout類的常用構(gòu)造方法:①

FlowLayout()

構(gòu)造一個(gè)新的

FlowLayout,居中對(duì)齊,默認(rèn)的水平和垂直間隙是

5個(gè)單位。9.8.1FlowLayout布局管理器②

FlowLayout(intalign)

構(gòu)造一個(gè)新的

FlowLayout,默認(rèn)的水平和垂直間隙是

5個(gè)單位。align指明每一行的對(duì)齊方式,值為FlowLayout類的整型常量:l

CENTER:指示每一行組件都應(yīng)該是居中的。

l

LEADING:指示每一行組件都應(yīng)該與容器方向的開始邊對(duì)齊。l

LEFT:指示每一行組件都應(yīng)該是左對(duì)齊的。

l

RIGHT:指示每一行組件都應(yīng)該是右對(duì)齊的。

l

TRAILING:指示每行組件都應(yīng)該與容器方向的結(jié)束邊對(duì)齊。③

FlowLayout(intalign,inthgap,intvgap)

創(chuàng)建具有指定的對(duì)齊方式以及指定的水平和垂直間隙的流布局管理器9.8.1FlowLayout布局管理器FlowLayout布局對(duì)象的常用方法:(1)

voidsetAlignment(intalign)

設(shè)置此布局的對(duì)齊方式。(2)voidlayoutContainer(Containertarget)

以FlowLayout的對(duì)齊方式重新布置容器。9.8.1FlowLayout布局管理器例9-7使用FlowLayout布局管理器來定位Frame組件中的三個(gè)按鈕。程序在Frame組件中加入三個(gè)按鈕,通過用戶單擊按鈕可改變流布局管理器的對(duì)齊方式。運(yùn)行結(jié)果:

publicclassFlowLayoutDemoextendsJFrame{privateJButtonleftButton,centerButton,rightButton;privateContainercontainer;privateFlowLayoutlayout;publicFlowLayoutDemo(){super("FlowLayout布局管理");

layout=newFlowLayout();container=getContentPane();container.setLayout(layout);//setupleftButtonandregisterlistenerleftButton=newJButton("左對(duì)齊");container.add(leftButton);leftButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){layout.setAlignment(FlowLayout.LEFT);

layout.layoutContainer(container);

//重新對(duì)齊容器中的組件

}});//endcalltoaddActionListenercenterButton=newJButton("中心對(duì)齊");container.add(centerButton);centerButton.addActionListener(newActionListener(){//anonymousinnerclass//processcenterButtonevent

publicvoidactionPerformed(ActionEventevent){layout.setAlignment(FlowLayout.CENTER);layout.layoutContainer(container);}});rightButton=newJButton("右對(duì)齊");container.add(rightButton);rightButton.addActionListener(newActionListener(){//anonymousinnerclass

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論