




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java程序設計第16章用戶界面開發學習目標利用JFrame創建可定制的應用程序主窗口理解組件和容器的差異,區別頂級容器和中間容器的作用能夠靈活應用布局管理器組織界面如何向容器中添加和布局組件理解事件機制,掌握各類監聽器的創建、注冊和處理掌握基本的圖形處理程序開發16.1.1從AWT到Swing抽象窗口工具包AWT(AbstractWindowToolkit)是Java類庫程序提供的建立圖形用戶界面GUI(GraphicsUserInterface)工具集,Swing類提供了GUI編程較為通用的部分,被統稱為JavaFoundationClasses(Java語言基礎類,簡稱JFC)。Swing采用了一種MVC的設計范式,即"模型-視圖-控制"(Model-View-Controller),其中模型用來保存內容,視圖用來顯示內容,控制器用來控制用戶輸入。16.1.2模型-視圖-控制體系
Swing勝過AWT的主要優勢在于MVC體系結構的普遍使用。在一個MVC用戶界面中,存在三個相互通信的對象:模型、視圖和控件。模型是指定的邏輯表示法視圖是模型的可視化表示法控件則指定了如何處理用戶輸入。當模型發生改變時,它會通知所有依賴它的視圖,視圖使用控件指定其響應機制。16.1.3創建第一個Swing窗口
publicclassFirstSwingApp{publicstaticvoidmain(String[]args){//創建一個頂層容器并設置其標題為FirstSwingApp。JFrameframe=newJFrame("FirstSwingApp");frame.add(newJButton(“OK”));//向窗口中增加一個按鈕//設置窗口中右上角的關閉按鈕圖標的缺省操作事件是關閉程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(600,400);//設置窗口對象的尺寸/讓窗口對象自行決定以最合適的方式顯示窗口,并不依賴前面的定義尺寸frame.pack();frame.setVisible(true);//最后,讓窗口對象可見}}圖16-1JFrame的繼承層次16.2容器和基本組件
組件(Component)代表一種可以顯示在屏幕上的圖形元素,也是一種能與用戶進行交互的Java對象,例如一個按鈕,一個標簽等。組件不能獨立地顯示出來,必須將組件放在一定的容器中才可以顯示出來。容器(Container)容器類繼承于Component類,其本身及其子類可以容納其他組件對象Swing應用程序的容器層次設計GUI時,都有用于放置可視化組件的主窗口。Container對象可用于將組件組合在一起。容器中的組件根據特定布局排列。Swing中的容器有兩類:-頂級容器-中間容器頂級容器JFrame:用于框架窗口的類,此窗口帶有邊框、標題、用于關閉和最小化窗口的圖標等。帶GUI的應用程序通常至少使用一個框架窗口。JDialog:用于對話框的類。JApplet:用于使用Swing組件的JavaApplet的類。中間容器JPanel:最靈活、最常用的中間容器。JScrollPane:與JPanel類似,但還可在大的組件或可擴展組件周圍提供滾動條。JTabbedPane:包含多個組件,但一次只顯示一個組件。用戶可在組件之間方便地切換。JToolBar:按行或列排列一組組件(通常是按鈕)。Swing類結構圖Swing有很多組件,這些組件從功能上分為以下幾類。頂層容器:JFrame,JApplet,JDialog,JWindow共4個。中間容器:JPanel,Box,JScrollPane,JSplitPane,JToolBar。特殊容器:在GUI上起特殊作用的中間層,如JInternalFrame,JLayeredPane,JRootPane。基本控件:實現人機交互的組件,如JButton,JComboBox,JList,JMenu,JSlider,
JTextField等。不可編輯信息的顯示:向用戶顯示不可編輯信息的組件,例如JLabel,JProgressBar,JToolTip等。可編輯信息的顯示:向用戶顯示能被編輯的格式化信息的組件,如JColorChooser,JFileChoose,
JFileChooser,
JTable,
JTextArea等。16.2.1設計主窗口
可以作為容器的類很多,但是能夠作為頂級容器控制整個界面的只有JFrame等四個,而這4個頂級容器中,JApplet類主要開發用于在瀏覽器中的applet小程序JWindow它沒有標題欄、窗口管理按鈕或者其他與JFrame關聯的修飾,并不適合做主窗口JFrame對象是用來代表應用程序的主窗口的最佳選擇JDialog通常需要一個JFrame對象來構造。16.1.3創建第一個Swing窗口
importjavax.swing.JFrame;publicclassMyFirstSwingAppextendsJFrame{publicMyFirstSwingApp(Stringtitle,intwidth,intheight){ super(title);//調用父類構造方法,同時設置窗口標題
//設置窗口的顯示尺寸
this.setSize(width,height); //設置窗口的關閉動作為關閉整個程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //一般在構造方法中組織自己的主界面顯示}
SwingGUI框架你好,世界菜單欄頂級容器GUI組件GUI組件內容窗格16.2.2添加組件到窗口
JFrame對象的getContentPane()方法返回一個對contentPane的引用JFrameJFrame組件用于在Swing程序中創建窗體,是放置其他Swing組件的頂級容器,它的構造函數:JFrame()JFrame(StringTitle)缺省的布局管理器是BoderLayout添加組件到內容窗格,兩種方法,示例:frame.getContentPane().add(newJButton(“button”));frame.add(newJButton(“button”));JFrame包含一個JRootPane作為其惟一的子容器,用來管理其所有內容,包括:內容窗格菜單分層窗格玻璃窗格大部分情況下,我們只使用內容窗格關閉FramesetDefaultCloseOperation(int
operation)設置用戶在此窗體上發起"close"時默認執行的操作。必須指定以下選項之一:DO_NOTHING_ON_CLOSE(在WindowConstants中定義):不執行任何操作;要求程序在已注冊的WindowListener對象的windowClosing方法中處理該操作。HIDE_ON_CLOSE(在WindowConstants中定義):調用任意已注冊的WindowListener對象后自動隱藏該窗體。DISPOSE_ON_CLOSE(在WindowConstants中定義):調用任意已注冊WindowListener的對象后自動隱藏并釋放該窗體。EXIT_ON_CLOSE(在JFrame中定義):使用Systemexit方法退出應用程序。僅在應用程序中使用。默認情況下,該值被設置為HIDE_ON_CLOSE。常用的JFrame方法voidadd(Componentc)voidsetJMenuBar(JMenuBarMenu)voidpack()voidremove(Componentc)voidsetIconImage(Iconimage)voidsetLayout(LayoutManagerlayout)voidsetSize(intwidth,intheight)16.2.3組件的基本功能顏色設置可以使用setBackground()方法和setForeground()來設置組件的背景色和前景色btnOK.setBackground(Color.BLUE);邊框設置使用setBorder()方法可以設置組件外圍的邊框btnOK.setBorder(BorderFactory.createLineBorder(Color.RED));雙緩沖區使用雙緩沖技術能改進頻繁變化的組件的顯示效果,如果想關閉雙緩沖區,可以在組件上施加setDoubleBuffered(false)方法提示信息:使用setTooltipText()方法,為組件設置對用戶有幫助的提示信息btnOK.setToolTipText("Hi,這是一個按鈕");鍵盤導航:用setMnemonic()方法指定一個字符,通過這個字符和一個當前L&F(LookandFeel,觀感)的無鼠標修飾符(通常是Alt)共同激活按鈕動作btnOK.setMnemonic(KeyEvent.VK_O);可插入L&F:每個JComponent對象有一個相應的ComponentUI對象,為它完成所有的繪畫、事件處理、決定尺寸大小等工作。ComponentUI對象依賴當前使用的L&F,用UIManager.setLookAndFeel()方法可以設置需要的L&F。支持布局:通過設置組件最大、最小、推薦尺寸的方法和設置X、Y對齊參數值的方法能指定布局管理器的約束條件,為布局提供支持。16.2.4按鈕JButton
JButton類允許用圖標、字符串或兩者同時構造一個按鈕JButton()//創建不帶有設置文本或圖標的按鈕。JButton(Iconicon)//創建一個帶圖標的按鈕。JButton(Stringtext)//創建一個帶文本的按鈕。JButton(Stringtext,Iconicon)//創建一個帶初始文本和圖標的按鈕。ImageIconbuttonIcon=newImageIcon("on.gif");JButtonbtnLogin=newJButton("登陸(L)",buttonIcon);btnLogin.setMnemonic(KeyEvent.VK_L);16.2.5標簽JLabelJLabel對象可以顯示文本、圖像或同時顯示二者JLabelJLabel(IconimageJLabel(Iconimage,inthorizontalAlignment)JLabel(Stringtext)
JLabel(Stringtext,Iconicon,inthorizontalAlignment)JLabel(Stringtext,inthorizontalAlignment)aImageIconicon=newImageIcon("on.gif");JLabellblUser=newJLabel("用戶名",icon,SwingConstants.LEFT);SwingConstants中定義的以下常量:LEFT、CENTER、RIGHT、LEADING或TRAILING,定義了組件的對齊方式16.2.6文本組件單行文本輸入框JTextFieldJTextField()JTextField(Documentdoc,Stringtext,intcolumns)JTextField(intcolumns)JTextField(Stringtext)JTextField(Stringtext,intcolumns)其他主要方法publicStringgetText()//獲取組件包含的文本publicStringgetText(intoffs,intlen)//獲取組件包含的文本部分(有偏移量和長度決定)publicStringgetSelectedText()//返回此TextComponent中包含的選定文本多行純文本編輯框JTextAreaJTextArea()JTextArea(introws,intcolumns)JTextArea(Stringtext)JTextArea(Stringtext,introws,intcolumns)密碼輸入框JPasswordFieldJPasswordField()JPasswordField(intcolumns)JPasswordField(Stringtext)JPasswordField(Stringtext,intcolumns)設置輸入字符的回顯字符的方法是:publicvoidsetEchoChar(char
c)16.2.7選擇性輸入組件JCheckBox復選框是一個可以被選定和取消選定的項,它將其選擇狀態顯示給用戶。JCheckBox()JCheckBox(Iconicon)JCheckBox(Iconicon,booleanselected)JCheckBox(Stringtext)JCheckBox(Stringtext,booleanselected)JCheckBox(Stringtext,Iconicon)JCheckBox(Stringtext,Iconicon,booleanselected)判斷一個復選框是否被選中的方法是publicbooleanisSelected()JRadioButtonRadioButton實現一個單選按鈕,一般和ButtonGroup對象結合,實現多中選一的目標。JRadioButtonrdb1=newJRadioButton("rdb1");JRadioButtonrdb2=newJRadioButton("rdb2");JRadioButtonrdb3=newJRadioButton("rdb3");//下面將三個按鈕加入到一個組中,而剩余兩個沒有加入ButtonGroupbg=newButtonGroup();bg.add(rdb1);bg.add(rdb2);bg.add(rdb3);JRadioButtonrdb4=newJRadioButton("rdb4");ButtonGroup只是對JRadioButton進行了邏輯分組,本身不是一個組件類16.2.8列表JListJList用來顯示對象列表并且允許用戶選擇一個或多個項的組件。單獨的模型ListModel維護列表的內容。JList()JList(ListModeldataModel)JList(Object[]listData)JList(Vector<?>listData)String[]data={"one","two","three","four"};JListmyList=newJList(data);myList.setBorder(BorderFactory.createEtchedBorder());//設置myList的邊框設置選擇模式一個JList的默認選擇模式是任意選擇,通過調用對象的setSelectionMode方法可以修改選擇模式ListSelectionModel.SINGLE_INTERVAL_SELECTION:一次只能選擇一個連續間隔ListSelectionModel.MULTIPLE_INTERVAL_SELECTION:在此模式中,不存在對選擇的限制。此模式是默認設置。myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);獲得選擇的數據publicintgetSelectedIndex();返回最小的選擇單元索引;選擇了多項時,則只返回最小的選擇索引。如果什么也沒有選擇,則返回
-1publicObjectgetSelectedValue();可以獲得所選的對象publicint[]getSelectedIndices();所選的全部索引(按升序排列);如果什么也沒有選擇,則返回一個空數組。publicObject[]getSelectedValues();返回所有選擇值的數組。利用ListSelectionModel管理選擇數據可以利用一個獨立的ListSelectionModel對象管理JList組件的當前選擇狀態,該對象顯示一個具有穩定索引的值列表。可以用下面的方法得到這個選擇模型。publicListSelectionModelgetSelectionModel()利用ListModel設置和獲取JList對象的值ListModel接口定義了方法組件(如JList),這些組件用于獲取列表中每個單元格的值以及列表的長度publicvoidaddElement(Objectobj)//將指定組件添加到此類表的末尾publicvoidremoveElementAt(int
index)//刪除指定索引處的組件16.2.9表格JTableJTable用來顯示和編輯常規二維單元表,其構造過程和基本功能類似于JList。16.2.10添加菜單到窗口菜單欄并不被添加到內容窗格中,而是有自己的固定位置,因此,添加菜單到窗口有自己的方法。首先,創建一個JMenuBar菜單欄對象將創建的菜單JMenu對象按順序追加到JMenuBar對象中,而菜單項JMenuItem則一個個按順序追加到對應的JMenu對象中,最后將JMenuBar對象設置為當前窗口的菜單欄。JMenuBarmnubar=newJMenuBar();JMenumnuFirst=newJMenu("文件");
mnubar.add(mnuFirst);JMenuItemitmAdd=newJMenuItem("添加");
mnuFirst.add(itmAdd);mnuFirst.addSeparator();//增加菜單分隔符JMenuItemitmExit=newJMenuItem("退出(E)");mnuFirst.add(itmExit);itmExit.setMnemonic(KeyEvent.VK_E);itmExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_DOWN_MASK));JMenumnuSecpmd=newJMenu("Help");mnubar.add(mnuSecpmd);//將mnuBar設置為當前窗口的菜單欄對象this.setJMenuBar(mnubar);16.3布局管理器
程序16-1和前述其他程序運行的界面效果差別很大,16-1界面中的按鈕占滿了窗口,而其他程序則沒有,主要差別是其他程序在構造方法中均有這么一行語句:this.setContentPane(newJPanel());決定組件在容器中排列方式的對象稱為布局管理器(LayoutManager)Swing程序采用布局管理器來管理組件的排放、位置、大小等布置任務,能實現平臺無關的自動合理排列。Java提供了多種類型的布局管理器,如BorderLayout、FlowLayout、GridLayout、GridBagLayout、CardLayout等等,每種管理器都有著特殊的組件布局管理方式。16.3.1BorderLayout
邊界布局管理器BorderLayout將管理的容器分為東西南北中五個位置,并通過BorderLayout類中相應的類常量進行標識:NORTH、SOUTH、EAST、WEST、CENTER,可以重復添加組件到相同的位置,但前面的組件將被移走。16.3.2FlowLayout
FlowLayout布局方式是將組件一排一排地依次放置,它自動調用組件的getPreferredSize()方法,使用組件的最佳尺寸來顯示組件。當容器被重新設置大小后,則布局也會隨之發生改變:各組件的大小不變,但相對位置會發生變化。它是JPanel的默認布局。構造方法FlowLayout()//居中對齊,默認的水平和垂直間隙是5個單位。FlowLayout(intalign)//它具有指定的對齊方式(FlowLayout類聲明的三個類常量LEFT,RIGHT,CENTER),默認的水平和垂直間隙是5個單位。FlowLayout(intalign,inthgap,intvgap)//創建一個新的流布局管理器,它具有指定的對齊方式以及指定的水平和垂直間隙。16.3.3BoxLayout
BoxLayout允許垂直或水平布置多個組件的布局管理器。構造方法:publicBoxLayout(Containertarget,intaxis)//創建一個水平排列組件的Box容器Boxhbox=Box.createHorizontalBox();//創建一個垂直排列組件的Box容器Boxvbox=Box.createVerticalBox();//將組件加入Box的容器中的方法如下面的語句:hbox.add(newJButton("button1"));hbox.add(newJButton("button2"));調整Box內部組件間的間隔
用Box的類方法createRigidArea()在組件間添加空白hbox.add(newJButton("button1"));//追加一個按鈕到Box容器中hbox.add(Box.createRigidArea(newDimension(20,0)));hbox.add(newJButton("button2"));Box還可以用類方法createHorizontalGlue()創建自動占據剩余空間的水平透明組件(同樣還有垂直組件),如果有多個Glue組件,則它們平分一個方向上的剩余空間定義自己的尺寸。Box提供的第三類透明組件是Strut,它定義了在一個方向上具有固定尺寸的Strut16.3.4GridLayout
GridLayout布局方式可以使容器中的各組件呈網格狀分布。容器中各組件的高度和寬度相同,當容器的尺寸發生變化時,各組件的相對位置不變,但各自的尺寸會發生變化。GridLayout的構造方法如下:GridLayout()//創建具有默認值的網格布局,即每個組件占據一行一列。
GridLayout(introws,intcols)//創建具有指定行數和列數的網格布局。
GridLayout(introws,intcols,inthgap,intvgap)//創建具有指定行數和列數的網格布局,此外,將水平和垂直間距設置為指定值。16.4用中間容器組織界面元素
JFrame是用來創建主窗口的頂級容器,很多程序中,組件并不直接添加到JFrame容器中,而是通過用中間容器組織好界面的布局,最后再根據要求將不同的中間容器對象加入到主窗口中,從而可以實現復雜的界面變換。常用的中間容器有:JPanel:最靈活、最常用的中間容器,其默認的布局管理器是FlowLayout。Box:綜合利用其水平和垂直Box,可以方便的布局一個規整的組件顯示。JScrollPane:與JPanel類似,但還可在大的組件或可擴展組件周圍提供滾動條。常用構造方法:JScrollPane(Componentc);16.4用中間容器組織界面元素
常用的中間容器有:JPanel:最靈活、最常用的中間容器,其默認的布局管理器是FlowLayout。Box:綜合利用其水平和垂直Box,可以方便的布局一個規整的組件顯示。JScrollPane:與JPanel類似,但還可在大的組件或可擴展組件周圍提供滾動條。常用構造方法:JScrollPane(Componentc);JTabbedPane:包含多個組件,但一次只顯示一個組件。用戶可在組件之間方便地切換。JToolBar:按行或列排列一組組件(通常是按鈕)。JSplitPane:用于拆分窗口;16.5事件機制
開發Swing程序一般遵循這樣的步驟:根據需要創建不同的界面類添加合適的組件到對應的界面類中為界面和界面中的組件添加必要的事件監聽器,對諸如菜單選擇、點擊按鈕以及文本輸入之類的事件進行響應。16.5.1事件處理過程
16.6.2主要事件類型
表16-2部分事件及監聽器事件類型事件源組件類型監聽器接口必須實現的方法ActionEventJButton,JCheckBox,JMenuIte,JMenu,JCheckBoxMenuItem,JTextField等ActionListenervoidactionPerformed(ActionEvente)ItemEventJButton,JCheckBox,JMenuItem,JMenu,JCheckBoxMenuItem,JTextField等ItemListenervoiditemStateChanged(ItemEvente)MouseEventJFrame,JPanel,JButton等容器類MouseListenerMouseMotionListenerMouseWheelListenervoidmouseClicked(MouseEvente)mousePressedmouseReleasedmouseDraggedmouseMovedmouseWheelMoved定義監聽器importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;publicclassButtonListenerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ //添加事件發生時的代碼
}}將監聽器和事件源綁定JButtonbtnLogin=newJButton(“登錄”);ButtonListenerloginListener=newButtonListener();btnLogin.addActionListener(loginListener);//將監聽器注冊到按鈕對象上16.6對話框
和利用中間容器組織界面不同,Java提供了一類特殊的窗口編程,就是對話框編程。對話框可以顯示在另一個窗口即父窗口的范圍內,使用對話框可以在不切換原有視圖內容的情況下和用戶交互,例如簡單的輸入、操作確認等。16.7.1選項對話框
JOptionPane彈出要求用戶提供輸入值或向其發出通知的標準對話框。publicvoidactionPerformed(ActionEvente){ JOptionPane.showConfirmDialog(null, "您確認刪除這條信息嗎?","操作提示",JOptionPane.YES_NO_OPTION);}JOptionPane確認對話框showConfirmDialog信息告知對話框showMessageDialog選項對話框showOptionDialog只能在指定窗口內移動的對話框showInternalXxxxDialog16.6.2文件對話框JFileChooser為用戶選擇文件提供了一種簡單的機制,通過它可以獲得用戶選擇的文件信息,如位置和文件名等,進而可以利用前面介紹的I/O編程的知識實現文件的處理。publicvoidactionPerformed(ActionEvente){JFileChooserchooser=newJFileChooser();//創建了一個文件名過濾器,文件類型參數是一個變長的參數類型FileNameExtensionFilterfilter=newFileNameExtensionFilter( "JPG&GIFImages","jpg","gif");chooser.setFileFilter(filter);//return保存了用戶選擇按鈕的情況intreturnVal=chooser.showOpenDialog(this);//利用getSelectedFile方法返回一個File對象表示用戶選中的文件if(returnVal==JFileChooser.APPROVE_OPTION){ System.out.println("被選擇的文件是:“ +chooser.getSelectedFile().getName());}}16.7.3自定義對話框
可以通過繼承JDialog創建一個自定義的對話框,滿足程序特定的需要。創建一個對話框重點需要確定以下幾個問題:滿足應用需要的組件搭配和屏幕布局,這個過程和前面講述的窗口和容器的處理一致。如何向使用者返回必要的信息,包括用戶所需的結果和關閉對話框的方式等等。16.8圖形編程基礎
組件的顯示每個組件知道應該如何顯示自己,這是因為每個組件都有一個paint的方法,當組件需要顯示時,運行時環境
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 國際貿易代理基礎知識考核試卷
- 珠寶首飾表面處理技術考核試卷
- 玻璃制品耐候性測試與優化考核試卷
- 稻谷種植農業氣象服務需求與供給考核試卷
- 新材料新技術引領可持續發展的新方向考核試卷
- 果蔬汁飲料的企業文化與品牌建設考核試卷
- 紡織企業成本分析與控制考核試卷
- 勞務派遣企業招聘渠道分析與優化考核試卷
- 濟南大學《模特經紀管理》2023-2024學年第二學期期末試卷
- 江西服裝學院《嬰幼兒護理與急救》2023-2024學年第二學期期末試卷
- 水資源論證工作大綱
- 中考物理命題培訓講座
- 生產安全事故風險評估報告(參考模板)
- 125萬噸硫鐵礦斜坡道施工組織設計
- 畢業設計10層框架—剪力墻結構體系設計計算書
- 東南大學論文模板v1.1
- 神經系統體格檢查-PPT課件
- 賽英公司FOD監測雷達系統
- 固體制劑車間主要過程控制點
- 膿毒癥的診療規范 中醫
- 關于基礎底板“跳倉法”施工熱工計算
評論
0/150
提交評論