Java面向?qū)ο蟪绦蛟O(shè)計(jì)(IDEA版) 課件 第12章圖形界面編程_第1頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(IDEA版) 課件 第12章圖形界面編程_第2頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(IDEA版) 課件 第12章圖形界面編程_第3頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(IDEA版) 課件 第12章圖形界面編程_第4頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(IDEA版) 課件 第12章圖形界面編程_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

面向?qū)ο蟪绦蛟O(shè)計(jì)第12章圖形界面編程

1組件和容器23主要內(nèi)容面向?qū)ο蟪绦蛟O(shè)計(jì)(Java語言描述微課版第基于IntelliJIDEA)容器布局事件處理45常用組件案例學(xué)習(xí):八皇后問題解6案例學(xué)習(xí):簡單的日歷程序面向?qū)ο蟪绦蛟O(shè)計(jì)12.1組件和容器Java從1.0版就提供了一個(gè)AWT類庫,稱為抽象窗口工具箱(AbstractWindowToolkit,AWT)。使用AWT創(chuàng)建GUI存在嚴(yán)重缺陷。概述Java從1.2版開始提供了一個(gè)新的組件庫Swing,該庫可以說是第二代GUI開發(fā)工具集。Swing組件完全用Java編寫,它們不依賴于特定平臺,因此是輕量級的組件(lightweightcomponent),輕量級組件具有重要優(yōu)點(diǎn),包括高效性和靈活性。12.1.1Swing概述由于Swing組件比AWT組件有許多優(yōu)點(diǎn),所以新開發(fā)的程序應(yīng)該使用Swing組件。但要注意Swing并沒有完全取代AWT,它只是替代了AWT包中的UI組件(如Button、TextField等),一些輔助類(如Graphics、Color、Font等)仍然保持不變。Swing圖形界面元素稱為組件,大多數(shù)組件都派生于JComponent類(頂級容器除外)。JComponent類提供了所有組件的通用功能。所有的Swing組件類都定義在javax.swing包中,表12-1列出了Swing常用的組件類。12.1.2組件類

名類

名類

名類

名JButtonJCheckBoxJColorChooserJComboBoxJComponentJDialogJFileChooserJFraneJLabelJListJMenuJMenuBarJMenuItemJOptionPaneJPanelJPasswordFiedJPopupMenuJProgressBarJRadioButtonJRadioButtonMenuItemJScrollBarJScrollPaneJSeparatorJTableJTextAreaJTextFieldJToolTipJTreeSwing組件需要放置到容器中,Swing定義了兩種類型的容器,第一種是頂級容器,如JFrame、JDialog和JApplet(從JDK9開始,JApplet已被廢棄)。這些容器繼承自AWT的Container類,而不是繼承自JComponent類。12.1.3容器Swing還支持輕量級容器,它們繼承自JComponent類,包括JPanel、JScrollPane、JRootPane等。輕量級容器通常用來組織和管理一組相關(guān)的組件,因?yàn)檩p量級容器可以包含在另一個(gè)容器中。每個(gè)使用Swing的程序必須至少有一個(gè)頂層Swing容器。對GUI應(yīng)用程序來說,一般應(yīng)該有一個(gè)主窗口,或稱框架窗口。在Swing中,窗口是由JFrame對象實(shí)現(xiàn)的。12.1.4簡單的Swing程序下面程序使用JFrame類創(chuàng)建一個(gè)空的框架窗口容器,其上放置一個(gè)標(biāo)簽對象,調(diào)用它的方法設(shè)置有關(guān)屬性,最后顯示該窗口。publicclassHelloSwing{publicstaticvoidmain(String[]args){varframe=newJFrame("HelloSwing");varlabel=newJLabel("第一個(gè)Swing程序。",SwingConstants.CENTER);frame.setSize(300,100);frame.add(label);frame.setLocationRelativeTo(null);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}面向?qū)ο蟪绦蛟O(shè)計(jì)12.2容器布局FlowLayout布局叫流式布局,它是最簡單的布局管理器。容器設(shè)置為這種布局,那么添加到容器中的組件將從左到右,從上到下,一個(gè)一個(gè)地放置到容器中,一行放不下,放到下一行。下面是FlowLayout類常用的構(gòu)造方法:publicFlowLayout(intalign,inthgap,intvgap)指定添加到容器中組件的對齊方式(align)、水平間距(hgap)和垂直間距(vgap)。對齊方式align的取值必須為下列三者之一:FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER,它們是FlowLayout定義的整型常量。水平間距是指水平方向上兩個(gè)組件之間的距離,垂直間距是行之間的距離,單位都是像素。12.2.1FlowLayout布局publicstaticvoidmain(String[]args){varframe=newJFrame("FlowLayoutDemo");//創(chuàng)建一個(gè)FlowLayout對象

varlayout=newFlowLayout(FlowLayout.CENTER,10,20);frame.setLayout(layout);//設(shè)置容器的布局管理器

frame.add(newJButton("Button1"));frame.add(newJButton("2"));frame.add(newJButton("Button3"));frame.add(newJButton("Long-NamedButton4"));frame.add(newJButton("Button5"));frame.setSize(300,150);frame.setLocationRelativeTo(null);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}BorderLayout布局叫邊界式布局,它將容器分成上、下、左、右、中5個(gè)區(qū)域,每個(gè)區(qū)域可放置一個(gè)組件或其他容器。中間區(qū)域是在上、下、左、右都填滿后剩下的區(qū)域。BorderLayout布局管理器的構(gòu)造方法有:publicBorderLayout(inthgap,intvgap)參數(shù)hgap和vgap分別指定使用這種布局時(shí)組件之間的水平間隔和垂直間隔距離,單位是像素。添加組件使用add(Componentc,intindex)方法,c為添加的組件,index為指定的位置。指定位置需要使用BorderLayout類定義的5個(gè)常量:PAGE_START(頁頭)、PAGE_END(頁尾)、LINE_START(行首)、LINE_END(行尾)和CENTER(中部)。如果不指定位置,組件添加到中部位置。12.2.2BorderLayout布局publicstaticvoidmain(String[]args){varframe=newJFrame("BorderLayoutDemo");varjButton1=newJButton("頁頭");varjButton2=newJButton("頁尾");varjButton3=newJButton("行頭");varjButton4=newJButton("行尾");varjTextField=newJTextField("中央");frame.setLayout(newBorderLayout(10,10));//設(shè)置邊界式布局

frame.add(jButton1,BorderLayout.PAGE_START);frame.add(jButton2,BorderLayout.PAGE_END);frame.add(jButton3,BorderLayout.LINE_START);frame.add(jButton4,BorderLayout.LINE_END);frame.add(jTextField,BorderLayout.CENTER);...}GridLayout布局叫網(wǎng)格式布局,這種布局簡單地將容器分成大小相等的單元格,每個(gè)單元格可放置一個(gè)組件,每個(gè)組件占據(jù)單元格的整個(gè)空間,調(diào)整容器的大小,單元格大小隨之改變。下面是GridLayout類的常用構(gòu)造方法:publicGridLayout(introws,intcols,inthgap,intvgap)參數(shù)rows和cols分別指定網(wǎng)格布局的行數(shù)和列數(shù),hgap和vgap指定組件的水平間隔和垂直間隔,單位為像素。行和列參數(shù)至少有一個(gè)為非0值。向網(wǎng)格布局的容器中添加組件,只需調(diào)用容器的add()方法即可,不用指定位置,系統(tǒng)按照先行后列的次序依次將組件添加到容器中。12.2.3GridLayout布局publicstaticvoidmain(String[]args){varframe=newJFrame("GridLayoutDemo");frame.setLayout(newGridLayout(3,2));//向容器中添加8個(gè)按鈕for(vari=1;i<=8;i++){frame.add(newJButton("Button"+i));}frame.setSize(300,150);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}設(shè)計(jì)復(fù)雜布局時(shí)通常采用容器嵌套的方式,即把組件添加到一個(gè)中間容器中,再把中間容器作為組件添加到另一個(gè)容器中,從而實(shí)現(xiàn)復(fù)雜的布局。12.2.4Jpanel類及容器嵌套使用面板容器作為中間容器構(gòu)建GUI程序的一般做法是:先將組件添加到面板上,然后將面板作為一個(gè)組件再添加到頂層容器中。使用面板作為中間容器,首先需要創(chuàng)建面板對象,JPanel的構(gòu)造方法如下:publicJPanel(LayoutManagerlayout)參數(shù)layout指定面板使用的布局管理器對象,缺省將使用默認(rèn)的布局管理器創(chuàng)建一個(gè)面板,面板的默認(rèn)的布局管理器是FlowLayout。publicclassFrameAndPanelextendsJFrame{JPanelpanel1=newJPanel(),panel2=newJPanel();publicFrameAndPanel(Stringtitle){super(title);panel1.setBackground(Color.CYAN);panel2.setLayout(newFlowLayout(FlowLayout.CENTER,20,10));panel2.add(newJButton("紅色"));panel2.add(newJButton("綠色"));panel2.add(newJButton("藍(lán)色"));panel2.add(newJButton("黃色"));程序12-5FrameAndPanel.javaadd(panel1,BorderLayout.CENTER);add(panel2,BorderLayout.PAGE_END);setSize(350,150);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}publicstaticvoidmain(String[]args){varframe=newFrameAndPanel("FrameAndPanel");}}面向?qū)ο蟪绦蛟O(shè)計(jì)12.3事件處理Java事件處理采用事件代理模型,即將事件的處理從事件源對象代理給一個(gè)或多個(gè)稱為事件監(jiān)聽器的對象,事件由事件監(jiān)聽器處理。12.3.1事件處理模型事件代理模型涉及3種對象:事件源、事件和事件監(jiān)聽器。事件源(eventsource):產(chǎn)生事件的對象,一般來說可以是組件,如按鈕、對話框等。當(dāng)這些對象的狀態(tài)改變時(shí),就會產(chǎn)生事件。事件源可以是可視化組件,也可以是計(jì)時(shí)器等不可視的對象。事件(event):描述事件源狀態(tài)改變的對象。如按鈕被點(diǎn)擊,就會產(chǎn)生ActionEvent動作事件。事件監(jiān)聽器(listener):接收事件并對其進(jìn)行處理的對象。事件監(jiān)聽器對象必須是實(shí)現(xiàn)了相應(yīng)接口的類的對象。Java的事件代理模型如圖12-6所示。12.3.1事件處理模型首先在事件源上注冊事件監(jiān)聽器,當(dāng)用戶動作觸發(fā)一個(gè)事件,運(yùn)行時(shí)系統(tǒng)將創(chuàng)建一個(gè)事件對象,然后尋找事件監(jiān)聽器對象來處理該事件。6.1.1java.util.EventObject類是所有事件類的根類,該類定義了getSource()方法,它返回觸發(fā)事件的事件源對象。java.awt.AWTEvent是EventObject類的子類,同時(shí)又是所有組件AWT事件類的根類,該類中定義了getID()方法,它返回事件的類型。表12-2列出了在哪些組件上可以產(chǎn)生哪些事件。為了實(shí)現(xiàn)事件處理,Java定義了大量的事件類,這些類封裝了事件對象。12.3.2事件類面向?qū)ο蟪绦蛟O(shè)計(jì)(Java語言描述微課版第基于IntelliJIDEA)清華大學(xué)出版社事件類型事件名稱產(chǎn)生事件的組件ActionEvent動作事件當(dāng)按下按鈕、雙擊列表項(xiàng)或選擇菜單項(xiàng)時(shí)產(chǎn)生該事件AdjustmentEvent調(diào)整事件操作滾動條時(shí)產(chǎn)生該事件ComponentEvent組件事件當(dāng)組件被隱藏、移動、調(diào)整大小、變?yōu)榭梢姇r(shí)產(chǎn)生該事件ContainerEvent容器事件從容器中添加或刪除一個(gè)組件時(shí)產(chǎn)生該事件FocusEvent焦點(diǎn)事件當(dāng)一個(gè)組件獲得或失去鍵盤焦點(diǎn)時(shí)產(chǎn)生該事件ItemEvent選項(xiàng)事件當(dāng)復(fù)選框或列表項(xiàng)被單擊時(shí),以及在做出選擇、或者選擇或取消一個(gè)可選菜單項(xiàng)時(shí)產(chǎn)生該事件KeyEvent鍵盤事件當(dāng)從鍵盤接收輸入時(shí)產(chǎn)生該事件MouseEvent鼠標(biāo)事件當(dāng)拖動、移動、按下或釋放鼠標(biāo)時(shí),或當(dāng)鼠標(biāo)進(jìn)入或退出一個(gè)組件時(shí)產(chǎn)生該事件MouseWheelEvent鼠標(biāo)輪事件當(dāng)滾動鼠標(biāo)滾輪時(shí)產(chǎn)生該事件TextEvent文本事件當(dāng)一個(gè)文本域的值或文本域改變時(shí)產(chǎn)生該事件WindowEvent窗口事件當(dāng)窗口被激活、關(guān)閉、取消激活、圖標(biāo)化、解除圖標(biāo)化、打開或關(guān)閉時(shí)產(chǎn)生該事件表12-2常用事件及產(chǎn)生事件的組件6.1.1事件的處理必須由實(shí)現(xiàn)了相應(yīng)的事件監(jiān)聽器接口的類對象處理。Java為每類事件定義了相應(yīng)的接口。事件類和接口都是在java.awt.event包中定義的。表12-3列出了常用的事件監(jiān)聽器接口、接口中定義的方法以及所處理的事件。12.3.3事件監(jiān)聽器面向?qū)ο蟪绦蛟O(shè)計(jì)(Java語言描述微課版第基于IntelliJIDEA)清華大學(xué)出版社表12-3事件監(jiān)聽器接口、方法及處理的事件監(jiān)聽器接口接口中的方法所處理的事件ActionListeneractionPerformed(ActionEvente)ActionEventItemListeneritemStateChanged(ItemEvente)ItemEventMouseListenermouseClicked(MouseEvente)mouseEntered(MouseEvente)mouseExited(MouseEvente)mousePressed(MouseEvente)mouseReleased(MouseEvente)MouseEventMouseMotionListenermouseMoved(MouseEvente)mouseDragged(MouseEvente)MouseEventKeyListenerkeyPressed(KeyEvente)keyReleased(KeyEvente)keyTyped(KeyEvente)KeyEvent1)實(shí)現(xiàn)相應(yīng)的監(jiān)聽器接口:根據(jù)要處理的事件確定實(shí)現(xiàn)哪個(gè)監(jiān)聽器接口。例如,要處理點(diǎn)擊按鈕事件,即ActionEvent事件,就需要實(shí)現(xiàn)ActionListener接口。12.3.4事件處理的基本步驟2)為組件注冊監(jiān)聽器:每種組件都定義了可以觸發(fā)的事件類型,使用相應(yīng)的方法為組件注冊監(jiān)聽器。如果程序運(yùn)行對某事件不需處理,也可以不注冊監(jiān)聽器,甚至注冊了監(jiān)聽器也可以注銷。注冊和注銷監(jiān)聽器的一般方法如下:publicvoidaddXxxListener(XxxListenerel)publicvoidremoveXxxListener(Xxxlistenerel)publicclassActionEventDemo{JLabeljLabel=newJLabel("請單擊按鈕.",SwingConstants.CENTER);JButtonbtn1=newJButton("確定"),btn2=newJButton("取消");JPaneljp=newJPanel();

publicActionEventDemo(){varframe=newJFrame("動作事件");frame.add(jLabel,BorderLayout.CENTER);jp.add(btn1);jp.add(btn2);frame.add(jp,BorderLayout.PAGE_END);程序12-6ActionEventDemo.java

varlistener=newButtonClickListener();btn1.addActionListener(listener);btn2.addActionListener(listener);

frame.setSize(300,100);frame.setLocationRelativeTo(null);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}

//定義內(nèi)部類,實(shí)現(xiàn)ActionListener接口

publicclassButtonClickListenerimplementsActionListener{publicvoidactionPerformed(ActionEvente){if((JButton)e.getSource()==btn1)jLabel.setText("你單擊了'確定'按鈕");//修改標(biāo)簽的內(nèi)容

elseif((JButton)e.getSource()==btn2)jLabel.setText("你單擊了'取消'按鈕");}}還可以使用匿名內(nèi)部類為組件注冊監(jiān)聽器,對上面的程序就可以使用匿名內(nèi)部類實(shí)現(xiàn),代碼如下:使用匿名內(nèi)部類btn1.addActionListener(newActionListener(){//匿名內(nèi)部類

publicvoidactionPerformed(ActionEvente){jLabel.setText("你單擊了'確定'按鈕");} });//這里是分號,表示語句的結(jié)束

btn2.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){jLabel.setText("你單擊了'取消'按鈕");} });由于ActionListener接口中只定義了一個(gè)抽象方法,因此該例可以使用Lambda表達(dá)式實(shí)現(xiàn),具體代碼如下。使用Lambda表達(dá)式btn1.addActionListener((e)->jLabel.setText("你單擊了'確定'按鈕"));btn2.addActionListener((e)->jLabel.setText("你單擊了'取消'按鈕"));面向?qū)ο蟪绦蛟O(shè)計(jì)12.4常用組件使用JTextArea對象可以顯示多行文本。下面是JTextArea的常用構(gòu)造方法:JTextArea(Stringtext,introws,intcolumns)12.4.1JTextArea類text為文本區(qū)的初始文本,rows和columns分別指定文本區(qū)的行數(shù)和列數(shù)。JTextArea類的常用方法有:publicvoidsetText(Stringtext):設(shè)置文本區(qū)的文本。publicvoidsetFont(Fontf):設(shè)置文本區(qū)當(dāng)前使用的字體。publicvoidcopy():將選定的文本復(fù)制到剪貼板。publicStringgetSelectedText():返回選定的文本。由于JTextArea不能管理滾動條,若需要使用滾動條,可將其放入JScrollPane內(nèi)。例如:JTextAreata=newJTextArea();JScrollPanepane=newJScrollPane(ta);add(pane,BorderLayout.CENTER);12.4.1JTextArea類JCheckBox類稱為復(fù)選框或檢查框。創(chuàng)建復(fù)選框的同時(shí)可以為其指明文本說明標(biāo)簽,這個(gè)文本標(biāo)簽用來說明復(fù)選框的意義和作用。創(chuàng)建復(fù)選框需使用JCheckBox類的構(gòu)造方法,其常用的構(gòu)造方法有:JCheckBox(Stringtext,Iconicon,booleanselected)參數(shù)text為復(fù)選框上標(biāo)簽;selected為狀態(tài),值為true為選中狀態(tài),false則為非選中狀態(tài);Icon為使用圖標(biāo)的復(fù)選框。使用JCheckBox類的實(shí)例方法isSelected()可以返回復(fù)選框的狀態(tài),如果復(fù)選框被選中返回true,否則返回false。12.4.2JCheckbox類在復(fù)選框上可以產(chǎn)生ItemEvent事件,因此要處理該事件必須實(shí)現(xiàn)ItemListener接口的itemStateChanged()方法,以決定在復(fù)選框是否選中時(shí)作出的響應(yīng)。實(shí)現(xiàn)ItemListener接口的一般方法如下:

publicvoiditemStateChanged(ItemEvente){if(e.getSource()instanceofJCheckBox){if(jchk1.isSelected())//處理代碼

if(jchk2.isSelected())//處理代碼}}12.4.2JCheckbox類JRadioButton類稱為單選按鈕,外觀上類似于復(fù)選框。不過復(fù)選框不管選中與否外觀都是方形的,而單選按鈕是圓形的。另外它只允許用戶從一組選項(xiàng)中選擇一個(gè)選項(xiàng)。JRadioButton類的常用構(gòu)造方法有:JRadioButton(Stringtext,Iconicon,booleanselected)12.2.4JRadioButton類通常將多個(gè)單選按鈕作為一組,此時(shí)一個(gè)時(shí)刻只能選中一個(gè)按鈕。將多個(gè)單選按鈕作為一組,需要創(chuàng)建一個(gè)javax.swing.ButtonGroup實(shí)例,并用add()方法將單選按鈕添加到該實(shí)例中,如下所示:ButtonGroupbtg=newButtonGroup();btg.add(jrb1);//將單選按鈕添加到按鈕組中btg.add(jrb2);publicclassRadioCheckDemoextendsJFrameimplementsItemListener{JPanelpanelCheck=newJPanel();JPanelpanelRadio=newJPanel();JRadioButtonjrb1=newJRadioButton("蘋果"),jrb2=newJRadioButton("橘子"), jrb3=newJRadioButton("香蕉");ButtonGroupbtg=newButtonGroup();JCheckBoxck1=newJCheckBox("文學(xué)"), ck2=newJCheckBox("藝術(shù)"), ck3=newJCheckBox("體育");JTextAreata=newJTextArea(3,20);JScrollPanejsp=newJScrollPane(ta);程序12-7RadioCheckDemo.javapublicRadioCheckDemo(){super("RadioCheckBoxDemo");panelCheck.add(ck1);panelCheck.add(ck2);panelCheck.add(ck3);btg.add(jrb1);btg.add(jrb2);btg.add(jrb3);panelRadio.add(jrb1);panelRadio.add(jrb2);panelRadio.add(jrb3);add(panelRadio,BorderLayout.PAGE_START);add(panelCheck,BorderLayout.CENTER);add(jsp,BorderLayout.PAGE_END);ck1.addItemListener(this);ck2.addItemListener(this);ck3.addItemListener(this);jrb1.addItemListener(this);jrb2.addItemListener(this);jrb3.addItemListener(this);setSize(300,180);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}publicvoiditemStateChanged(ItemEvente){ vars1="你最喜歡的水果是:"; vars2="你的愛好包括:"; if(jrb1.isSelected()) s1=s1+jrb1.getText()+"\n"; if(jrb2.isSelected()) s1=s1+jrb2.getText()+"\n"; if(jrb3.isSelected()) s1=s1+jrb3.getText()+"\n"; if(ck1.isSelected()) s2=s2+ck1.getText()+""; if(ck2.isSelected()) s2=s2+ck2.getText()+""; if(ck3.isSelected()) s2=s2+ck3.getText()+""; ta.setText(s1+s2);}JComboBox一般叫組合框或下拉列表框,它是一些項(xiàng)目的簡單列表,用戶能夠從中進(jìn)行選擇。使用它可以限制用戶的選擇范圍并可避免對輸入數(shù)據(jù)的有效性檢查。JComboBox類的構(gòu)造方法有:JComboBox(Object[]items)這里,items通常是一個(gè)字符串?dāng)?shù)組,它構(gòu)成組合框的選項(xiàng)。JComboBox對象可以引發(fā)ActionEvent事件和ItemEvent事件以及其他事件。當(dāng)使用鼠標(biāo)選中某個(gè)選項(xiàng)時(shí)將引發(fā)ItemEvent事件。12.4.4JComboBox類 JPanelpanel=newJPanel(); JComboBox<String>leave=newJComboBox<>(),//這里使用了泛型語法

arrive=newJComboBox<>(); JTextFieldleavedate=newJTextField(LocalDate.now().toString()); JTextAreata=newJTextArea(4,20); JScrollPanejsp=newJScrollPane(ta);程序12-8ComboBoxDemo.java publicComboBoxDemo(){ super("組合框案例"); leave.addItem("請選擇出發(fā)地"); leave.addItem("北京"); leave.addItem("上海"); leave.addItem("廣州"); arrive.addItem("請選擇到達(dá)地"); arrive.addItem("南京"); arrive.addItem("武漢"); arrive.addItem("???); panel.add(leave); panel.add(arrive); panel.add(leavedate); add(panel,BorderLayout.PAGE_START); add(jsp,BorderLayout.CENTER); leave.addItemListener(this); arrive.addItemListener(this); publicvoiditemStateChanged(ItemEvente){ Strings1="出發(fā)地:",s2="到達(dá)地:",s3="出發(fā)日期:"; s1=s1+leave.getSelectedItem()+"\n"; s2=s2+arrive.getSelectedItem()+"\n"; s3=s3+leavedate.getText(); ta.setText(s1+s2+s3); }使用Java可以創(chuàng)建兩種類型的對話框:用戶定制對話框和標(biāo)準(zhǔn)對話框。創(chuàng)建用戶定制的對話框可以使用JDialog類,創(chuàng)建標(biāo)準(zhǔn)對話框需要使用JOptionPane類。12.4.5JOptionPane類標(biāo)準(zhǔn)對話框通常包括圖標(biāo)區(qū)域、消息區(qū)域、輸入值區(qū)域和選項(xiàng)按鈕區(qū)域等。可以使用JOptionPane類的靜態(tài)方法彈出一個(gè)對話框。在JOptionPane類中定義了幾個(gè)靜態(tài)方法,可以用來創(chuàng)建標(biāo)準(zhǔn)對話框。使用JOptionPane類創(chuàng)建的標(biāo)準(zhǔn)對話框有消息對話框、輸入對話框、確認(rèn)對話框和選項(xiàng)對話框。使用showInputDialog()創(chuàng)建輸入對話框,如圖12-10所示。12.4.5JOptionPane類使用showMessageDialog()方法創(chuàng)建消息對話框,如圖12-11所示。使用showConfirmDialog()方法創(chuàng)建確認(rèn)對話框,如圖12-12所示。12.4.5JOptionPane類使用showOptionDialog()創(chuàng)建選項(xiàng)對話框,如圖12-13所示。

intmagic=-1;//存放隨機(jī)產(chǎn)生的整數(shù)

intguess=-1;//存放用戶猜的數(shù)

Strings=null; while(true){ magic=(int)(Math.random()*100)+1; try{ s=JOptionPane.showInputDialog(null,"請輸入你猜的數(shù)(1~100)"); guess=Integer.parseInt(s); while(guess!=magic){ if(guess>magic) JOptionPane.showMessageDialog(null,"猜的數(shù)太大了!"); else JOptionPane.showMessageDialog(null,"猜的數(shù)太小了!"); s=JOptionPane.showInputDialog(null,"請輸入你猜的數(shù)(1~100)"); guess=Integer.parseInt(s); }程序12-9GuessNumber.javainti=JOptionPane.showOptionDialog(null,"恭喜你!答對了!\n"+"繼續(xù)猜嗎?","是否繼續(xù)",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null,null,null);if(i==0) continue;elsebreak;}catch(NumberFormatExceptione){JOptionPane.showMessageDialog(null,"數(shù)字非法!"); continue;}}//endwhile}12.4.6JFileChooser類JFileChooser類用來創(chuàng)建文件對話框。有兩種類型的文件對話框:打開文件對話框和保存文件對話框。打開文件對話框是用于打開文件的,保存文件對話框是用于保存文件的。

publicJFileChooser():創(chuàng)建一個(gè)指向用戶默認(rèn)目錄的文件對話框?qū)ο?。publicJFileChooser(FilecurrentDirectory):使用File對象指定的目錄,創(chuàng)建一個(gè)文件對話框?qū)ο蟆?2.4.6JFileChooser類publicintshowOpenDialog(Componemtparent)publicintshowSaveDialog(Componentparent)publicvoidsetDialogTitle(StringdialogTitle)publicvoidsetDialogType(intdialogType)publicvoidsetSelectedFile(Filedir)publicFilegetSelectedFile()12.4.7菜單組件Java提供了6個(gè)實(shí)現(xiàn)菜單的類:JMenuBar、JMenu、JMenuItem、JCheckBoxMenuItem、JRadioButtonMenuItem、JPopupMenu。在Java程序中實(shí)現(xiàn)下拉式菜單首先創(chuàng)建一個(gè)頂級容器,然后創(chuàng)建一個(gè)菜單欄并把它與頂級容器關(guān)聯(lián)。JMenuBarjmb=newJMenuBar();//創(chuàng)建一個(gè)菜單欄對象frame.setJMenuBar(jmb);//將菜單欄與框架關(guān)聯(lián)12.4.7菜單組件創(chuàng)建菜單,然后把菜單添加到菜單欄上??梢允褂孟铝袠?gòu)造方法創(chuàng)建菜單,下面是創(chuàng)建菜單的例子:JMenufileMenu=newJMenu("文件(F)");//創(chuàng)建菜單JMenuhelpMenu=newJMenu("幫助(H)");jmb.add(fileMenu);//將菜單添加到菜單欄上jmb.add(helpMenu);創(chuàng)建菜單項(xiàng)并把它們添加到菜單上fileMenu.add(newJMenuItem("新建"));//創(chuàng)建一個(gè)菜單項(xiàng)并添加到菜單上fileMenu.add(newJMenuItem("打開"));fileMenu.addSeparator();//向菜單中添加一條分隔線fileMenu.add(newJMenuItem("打印"));12.4.7菜單組件彈出式菜單是當(dāng)用戶在界面中單擊鼠標(biāo)右鍵彈出的菜單,也叫上下文菜單。在Java中用JPopupMenu實(shí)現(xiàn)彈出菜單。JPopupMenupopupMenu=newJPopupMenu();JMenuItemitem1=newJMenuItem("查看");JMenuItemitem2=newJMenuItem("刷新");popupMenu.add(item1);popupMenu.addSeparator();popupMenu.add(item2);彈出菜單默認(rèn)是不可見的,要顯示出來,則必須調(diào)用它的show()方法。12.4.7菜單組件當(dāng)菜單項(xiàng)被選中時(shí),將引發(fā)ActionEvent事件,要處理該事件,必須實(shí)現(xiàn)ActionListener接口,下面是一個(gè)簡單的示例:publicclassMLimplementsActionListener{publicvoidactionPerformed(ActionEvente){ Stringm=e.getActionCommand(); if(m.equals("關(guān)于")){ JOptionPane.showMessageDialog(MenuDemo.this,"菜單案例"); }}}publicclassMenuDemoextendsJFrameimplementsActionListener{

publicMenuDemo(){

jmb=newJMenuBar();setJMenuBar(jmb);//將菜單欄添加到窗口上

fileMenu=newJMenu("文件(F)");fileMenu.setMnemonic('F');//設(shè)置熱鍵editMenu=newJMenu("編輯");helpMenu=newJMenu("幫助(H)");helpMenu.setMnemonic('H');程序12-10MenuDemo.javaaddMouseListener(newMouseAdapter(){publicvoidmouseClicked(MouseEvente){if(e.getButton()==MouseEvent.BUTTON3){ popupMenu.show(e.getComponent(),e.getX(),e.getY()); }}});publicvoidactionPerformed(ActionEvente){Stringm=e.getActionCommand();if(m.equals("About")){ JOptionPane.showMessageDialog(MenuDemo.this,"菜單案例");}}面向?qū)ο蟪绦蛟O(shè)計(jì)12.5案例學(xué)習(xí):八皇后問題解八皇后問題是指在一個(gè)8×8格的國際象棋盤上放置8個(gè)皇后(每個(gè)皇后只能占一個(gè)格子),使其不能互相攻擊,即任意兩個(gè)皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。問題描述程序運(yùn)行后首先顯示棋盤,用戶單擊某個(gè)格子將皇后放置到棋盤上,如果某個(gè)格子不允許放置皇后,程序顯示一個(gè)標(biāo)準(zhǔn)對話框,圖12-15是一個(gè)解。(1)本案例界面采用網(wǎng)格式布局,每個(gè)單元格放置一個(gè)按鈕,每個(gè)按鈕根據(jù)國際象棋的要求設(shè)置背景顏色為黑色和白色。按鈕是一個(gè)8行8列的數(shù)組。JButton[][]cells=newJButton[8][8];if((i+j)%2==0){cells[i][j].setBackground(Color.WHITE); }else{cells[i][j].setBackground(Color.BLACK);

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論