1. 程式人生 > >201711671119《Java程式設計》第九章學習總結

201711671119《Java程式設計》第九章學習總結

教學內容總結

Java Swing概述

1.容器類(Container)和 元件類(Component)

2.java.awt和javax.swing包中的部分類的層次關係的UML類圖如下:

3. GUI程式設計經常提到的基本知識點 。

(1)Java把Component類的子類或間接子類建立的物件稱為一個元件.

(2)Java把Container的子類或間接子類建立的物件稱為一個容器.

(3)可以向容器新增元件。Container類提供了一個public方法:add( ),一個容器可以呼叫這個方法將元件新增到該容器中。

(4)容器呼叫removeAll()方法可以移掉容器中的全部元件;呼叫remove(Component c)方法可以移掉容器中引數c指定的元件。

(5)注意到容器本身也是一個元件,因此可以把一個容器新增到另一個容器中實現容器的巢狀。

(6)每當容器新增新的元件或移掉元件時,應當讓容器呼叫validate()方法,以保證容器中的元件能正確顯示出來

如:

    JFrame f=new JFrame();

    JButton  button=new JButton("確定")

    f.add(button);

    …….

    f.remove(button);

視窗

1.Java提供的JFrame類的例項是一個底層容器,即通常所稱的視窗。其他元件必須被新增到底層容器中,以便藉助這個地層容器和作業系統進行資訊互動。

2.JFrame類是Container類的間接子類。當需要一個視窗時,可使用JFrame或其子類建立一個物件。

3.可以向視窗新增元件。視窗預設地被系統新增到顯示器螢幕上,因此不允許將一個視窗新增到另一個容器中。

 

Jframe常用方法

1.JFrame構造方法:

JFrame() 建立一個無標題的視窗。

JFrame(String s) 建立標題為s的視窗。

2.常用方法:

1)public void setBounds(int a,int b,int width,int height 設定視窗的初始位置是(a,b),即距螢幕左面a個畫素、距螢幕上方b個畫素;視窗的寬是width,高是height。

2)public void setSize(int width,int height) 設定視窗的大小。

3)public void setLocation(int x,int y) 設定視窗的位置,預設位置是(0,0)。

4)public void setVisible(boolean b) 設定視窗是否可見,視窗預設是不可見的。

5)public void setResizable(boolean b) 設定視窗是否可調整大小,預設可調整大小。

6)public void dispose() 撤消當前視窗,並釋放當前視窗所使用的資源。

7)public void setExtendedState(int state) 設定視窗的擴充套件狀態.

8)public void setDefaultCloseOperation(int operation)  該方法用來設定單擊窗體右上角的關閉圖示後,程式會做出怎樣的處理。如:EXIT_ON_CLOSE

9)public void setLayout(LayoutManager mgr) 設定此容器的佈局管理器。

10)public Component add(Component comp) 將指定元件追加到此容器的尾部。

11)public void setMenuBar(MenuBar mb) 將此 frame 的選單欄設定為指定的選單欄。

12)public void validate() 使用 validate 方法會使容器再次佈置其子元件。在修改此容器的子元件的時候(在容器中新增或移除元件,或者更改與佈局相關的資訊),應該呼叫上述方法。

 

選單、選單條、選單項

1.選單條

  JComponent類的子類JMenubar負責建立選單條,JFrame類有一個將選單條放置到視窗中的方法:setJMenuBar(JMenuBar bar);該方法將選單條新增到視窗的頂端。

選單條JMenuBar類構造方法:JMenuBar(); JMenuBar  Mbar=new JMenuBar()

2.選單

  JComponent類的子類JMenu負責建立選單。

選單JMenu類構造方法:JMenu() ; JMenu(String s) ; JMenu m=new JMenu();

常用方法:

  public void add(JMenuItem item) 向選單增加由引數item指定的選單項

  public JMenuItem getItem(int n) 得到指定索引處的選單選項。

  public int getItemCount() 得到選單選項的數目。

3.選單項

  JComponent類的子類JMenuItem負責建立選單項,JMenuItem類的主要方法有以下幾種:

  JMenuItem(String s) 構造有標題的選單項。

  JMenuItem(String text, Icon icon) 構造有標題和圖示的選單項

  public void setAccelerator(KeyStroke keyStroke)為選單項設定快捷鍵

 

常用元件與佈局

一、常用元件

  1. 文字框:由JComponent的子類JTextField建立文字框。

    建構函式:JTextField( ) ; JTextField(int columns) ;

    常用方法:public String getText();  public void setText(String t);

    2.文字區:由JComponent的子類JTexArea建立文字區。

    建構函式:JTextArea() ;JTextArea(int rows, int columns)

    常用方法:public String getText();

                        public void setText(String t);

    3.按鈕:由JComponent的子類JButton類用來建立按鈕。

    建構函式:JButton() ; JButton(String text) ;

    常用方法:public void addActionListener(ActionListener l);

    4.標籤:由JComponent的子類JLabel類用來建立標籤。

    建構函式:JLabel() ; JLabel(String text) ; JLabel(Icon image) ;

    常用方法:public String getText(); 

                        public void setText(String t);

    5.選擇框:由JComponent的子類JCheckBox類用來建立選擇框

    建構函式: JCheckBox() ;JCheckBox(String text) ;

    常用方法: public void addItemListener(ItemListener l)

                         public void addActionListener(ActionListener l)

    ItemListener介面中:Object getItemSelectable()相當於getSource();

    public int getStateChange();若被選中SELECTED/DESEELCTED

    6.單選按鈕:由JComponent的子類JRadioButton類用來建立單項選擇框。

    建構函式: JRadioButton() ; JRadioButton(String text) ;

    常用方法: public void addItemListener(ItemListener l)

    7.下拉列表:由JComponent的子類JComboBox類用來建立下拉列表。

    建構函式:JComboBox() ; JComboBox(Object[] items)

    常用方法: public void addItemListener(ItemListener l)    

                        public Object getSelectedItem();

                        public int getSelectedIndex()

    8.密碼框:由JComponent的子類JPasswordField建立密碼框.

    建構函式:JPasswordField() ; JPasswordField(int columns)

    常用方法:public String getText();

                        public void setText(String t);

    public void setEchoChar(char c)使用該方法重新設定回顯字元.                      

    public char[] getPassword()方法可以返回實際的密碼

     

    二、常用容器

    JPanel 面板:

    構造方法:Jpanel() ;如: JPanel p=new JPanel();

    常用方法:public void add();

    使用JPanel建立面板,再向這個面板新增元件,然後把這個面板新增到其它容器中。JPanel面板的預設佈局是FlowLayout佈局。

     

    JTabbedPane選項卡窗格

    1.一個選項卡對應一個元件

    2.各個選項卡對應的元件層疊式放入JTabbedPane容器,當用戶單擊選項卡時,JTabbedPane

    2.各個選項卡對應的元件層疊式放入JTabbedPane容器,當用戶單擊選項卡時,JTabbedPane容器將顯示該選項卡對應的元件。

    3.選項卡預設地在JTabbedPane容器的頂部從左向右依次排列。

    4.使用add(String text,Component c);

    方法將元件c新增到JTabbedPane容器中,並指定和元件c對應的選項卡的文字提示是text。

     

    滾動窗格JScrollPane

  2. 滾動窗格只可以新增一個元件
  3. 需要把文字區放到一個滾動窗格中
  4.  

    拆分窗格JSplitPane

    拆分窗格有兩種型別:水平拆分和垂直拆分。

    .水平拆分窗格用一條拆分線把窗格分成左右兩部分,左面放一個元件,右面放一個元件,拆分線可以水平移動。垂直拆分窗格用一條拆分線把窗格分成上下兩部分,上面放一個元件,下面放一個元件,拆分線可以垂直移動。

     

    JLayeredPane分層窗格

    分層窗格使用

            add(Jcomponent com, int layer);

    新增元件com,並指定com所在的層,其中引數layer取值JLayeredPane類中的類常量:

    DEFAULT_LAYER、PALETTE_LAYER、MODAL_LAYER、POPUP_LAYER、DRAG_LAYER。

    1.DEFAULT_LAYER是最底層,新增到DEFAULT_LAYER層的元件如果和其他層的元件發生重疊時,將被其他元件遮擋。

    2.DRAG_LAYER層是最上面的層,如果分層窗格中添加了許多元件,當用戶用滑鼠移動一元件時,可以把該元件放到DRAG_LAYER層,

    分層窗格呼叫public void setLayer(Component c,int layer)可以重新設定元件c所在的層,呼叫public int getLayer(Component c)可以獲取元件c所在的層數。

     

    三、常用佈局

    java.awt包中的FlowLayout、BorderLayout、CardLayout、GridLayout佈局類和java.swing.border包中的BoxLayout佈局類。

     

    1.FlowLayout佈局:是JPanel型容器的預設佈局

           1)建立佈局物件 : FlowLayout flow=new FlowLayout();

           2)容器con使用佈局物件: con.setLayout(flow);

           3)con可以使用Container類提供的add方法將元件順序地新增到容器中

        FlowLayout佈局物件呼叫相應的方法可以重新設定佈局的對齊方式等.

        如: public void setAlignment(int align)

    2.BorderLayout佈局:

           BorderLayout 佈局是Window型容器的預設佈局 。

        使用BorderLayout佈局的容器con,可以使用add方法將一個元件b新增到中心區域:con.add(b,BorderLayout.CENTER);或  con.add(BorderLayour.CENTER,b);

    3.CardLayout 佈局 :  使用CardLayout的一般步驟如下:

             1)建立CardLayout物件 CardLayout card=new CardLayout();

             2)為容器設定佈局 con.setLayout(card);

          3)容器呼叫add(String s,Component b)將元件b加入容器,並給出了顯示該元件的代號s。

          4)佈局物件card用CardLayout類提供的show()方法,顯示容器con中元件代號為s的元件:card.show(con,s);

    4.GridLayout佈局 :

       GridLayout佈局策略是把容器劃分成若干行乘若干列的網格區域,元件就位於這些劃分出來的小格中。 GridLayout佈局編輯器的一般步驟如下:

       1)建立佈局物件,指定劃分網格的行數m和列數n

       GridLayout grid=new new GridLayout(10,8);

       2)使用GridLayout佈局的容器呼叫方法add(Component c)將元件c加入容器。    

    5.null佈局

    空佈局容器可以準確地定位元件在容器的位置和大小。setBounds(int a,int b,int width,int height)方法是所有元件都擁有的一個方法,元件呼叫該方法可以設定本身的大小和在容器中的位置。

  5. BoxLayout佈局
    1. Box類的類(靜態)方法 createHorizontalBox()獲得一個行型盒式容器;
    2. 使用Box類的類(靜態)方法 createVerticalBox()獲得一個列型盒式容器。
  6. 3)想控制盒式佈局容器中元件之間的距離,需使用水平支撐元件或垂直支撐。

     

     

    處理事件

    事件處理模式:事件源、監視器、處理事件的介面

     

    ActionEvent事件

    1.ActionEvent事件源 :

        文字框、按紐、選單項、密碼框和單選按紐都可以觸發ActionEvent事件,即都可以成為ActionEvent事件的事件源。

     2.註冊監視器: ActionListener介面作為監視器

        事件源.addActionListener(ActionListener listen)

       將實現ActionListener介面的類的例項註冊為事件源的監視器。

     3.ActionListener介面:重寫介面中的方法作為事件處理。

        ActionListener介面在java.awt.event包中,該介面中只有一個方法:

        public void actionPerformed(ActinEvent e)

            事件源觸發ActionEvent事件後,監視器將發現觸發的ActionEvent事件,然後呼叫介面中的這個方法對發生的事件作出處理。ActionEvent類事先建立的事件物件就會傳遞給該方法的引數e。  

    4.ActionEvent類中的方法:下面的方法能夠獲取發生動作的事件源。

       public Object getSource()

          呼叫該方法可以獲取發生ActionEvent事件的事件源物件的引用。

       public String getActionCommand()

          呼叫該方法可以獲取發生ActionEvent事件時,和該事件相關的一個命令字串

     

    ItemEvent事件

    1.ItemEvent事件源 :選擇框、下拉列表都可以觸發ItemEvent事件。

    2.註冊監視器:ItemListener介面作為監視器

         事件源.addItemListener(ItemListener listen)

         將實現ItemListener介面的類的例項註冊為事件源的監視器。

    3.ItemListener介面:重寫方法作為事件處理

        ItemListener介面在java.awt.event包中,該介面中只有一個方法

        public void itemStateChanged(ItemEvent e)

        事件源觸發ItemEvent事件後,監視器將發現觸發的ItemEvent事件,然後呼叫介面中的itemStateChanged(ItemEvent  e)方法對發生的事件作出處理。ItemEvent類事先建立的事件物件就會傳遞給該方法的引數e。

    4.ItemEvent類中的方法 :

        getSource()方法返回發生Itemevent事件的事件源外

        getItemSelectable()方法返回發生Itemevent事件的事件源。

     

    DocumentEvent事件

    1.DocumentEvent事件源 :文字區所維護的文件能觸發DocumentEvent事件  2.註冊監視器:DocumentListener作為監視器

         addDucumentListener(DocumentListener listen)

         將實現DocumentListener介面的類的例項註冊為事件源的監視器。

    3.DocumentListener介面:重寫介面中的方法作為事件處理

        DocumentListener介面在javax.swing.event包中,該介面中有三個方法:

              public void changedUpdate(DocumentEvent e)   

        public void removeUpdate(DocumentEvent e)

    public void insertUpdate(DocumentEvent e)

     

    MouseEvent事件

    1.使用MouseListener介面可以處理以下5種操作觸發的滑鼠事件

        在事件源上按下滑鼠鍵、在事件源上釋放滑鼠鍵、在事件源上擊滑鼠鍵、滑鼠進入事件源、滑鼠退出事件源。

    註冊監視器:MouseListener介面作為監視器

    事件源.addMouseListener(MouseListener listener)。

    MouseListener介面中有如下方法:重寫方法作為事件源的處理

       mousePressed(MouseEvent) 負責處理在元件上按下滑鼠鍵觸發的滑鼠事件

       mouseReleased(MouseEvent) 負責處理在元件上釋放滑鼠鍵觸發的滑鼠事件

       mouseEntered(MouseEvent) 負責處理滑鼠進入元件觸發的滑鼠事件

       mouseExited(MouseEvent) 負責處理滑鼠離開元件觸發的滑鼠事件

       mouseClicked(MouseEvent) 負責處理在元件上單擊滑鼠鍵觸發的滑鼠事件

    MouseEvent 中有下列幾個重要的方法:

         getX() 獲取滑鼠指標在事件源座標系中的x-座標。

         getY() 獲取滑鼠指標在事件源座標系中的y-座標。

         getModifiers() 獲取滑鼠的左鍵或右鍵。

         getClickCount() 獲取滑鼠被單擊的次數。

         getSource() 獲取發生滑鼠事件的事件源。

    2.使用MouseMotionListener介面可以處理以下兩種操作觸發的滑鼠事件,  在事件源上拖動滑鼠、在事件源上移動滑鼠。

     事件源註冊監視器的方法是

         addMouseMotionListener(MouseMotionListener listener)

     MouseMotionListener介面中有如下方法:

        mouseDragged(MouseEvent)  負責處理拖動滑鼠觸發的滑鼠事件。

        mouseMoved(MouseEvent)  負責處理移動滑鼠觸發的滑鼠事件

     

    焦點事件

    1.焦點事件源 :元件可以觸發焦點事件。

     2.註冊監視器:元件可以使用

        addFocusListener(FocusListener listener)

         註冊焦點事件監視器。

     3FocusListener介面 :

            建立監視器的類必須要實現FocusListener介面,該介面有兩個方法:

          public void focusGained(FocusEvent e)

          public void focusLost(FocusEvent e)

            當發生FocusEvent事件時,監視器呼叫類實現的介面中的相應方法。

     4.元件也可呼叫

           public boolean requestFocusInWindow()

        方法可以獲得輸入焦點。

     

    鍵盤事件

    當一個元件處於啟用狀態時,敲擊鍵盤上一個鍵就導致這個元件觸發鍵盤事件。

    1.某個元件使用addKeyListener方法註冊監視器。

    2.介面KeyListener中有如下方法:

         public void keyPressed(KeyEvent e),

      public void keyTyped(KeyEvent e),

      public void KeyReleased(KeyEvent e)  

    3.相關方法:

       public int getKeyCode()判斷哪個鍵被按下、敲擊或釋放,返回一個鍵碼值 。     

       getKeyChar()判斷哪個鍵被按下、敲擊或釋放,返回鍵上的字元。

     

    視窗事件

    1.WindowListener介面.

  7.   public void windowActivated(WindowEvent e)  當視窗從非啟用狀態到啟用時,視窗的監視器呼叫該方法。
  8. 有模式的對話方塊:當這個對話方塊處於啟用狀態時,只讓程式響應對話方塊內部的事件,而且將堵塞其它執行緒的執行,使用者不能再啟用對話方塊所在程式中的其它視窗,直到該對話方塊消

    (2) public void windowDeactivated(WindowEvent e)  當視窗啟用狀態到非啟用狀態時,視窗的監視器呼叫該方法。

    (3) public void windowClosing(WindowEvent e)  當視窗正在被關閉時,視窗的監視器呼叫該方法。

    (4) public void windowClosed(WindowEvent e)  當視窗關閉後,視窗的監視器呼叫該方法。

    (5) public void windowIconified(WindowEvent e)  當視窗圖示化時,視窗的監視器呼叫該方法。

    (6) public void windowDeiconified(WindowEvent e)  當視窗撤消圖示化時,視窗的監視器呼叫該方法。

    (7) public void windowOpened(WindowEvent e)  當視窗開啟時,視窗的監視器呼叫該方法。

     

    WindowAdapter介面卡

    介面卡可以代替介面來處理事件

     

    匿名類例項或視窗做監視器

    匿名類的方便之處是匿名類的外嵌類的成員變數在匿名類中仍然有效,當發生事件時,監視器就比較容易操作事件源所在的外嵌類中的成員。

     

    事件總結

    1.授權模式

       Java的事件處理是基於授權模式,即事件源呼叫呼叫方法將某個物件註冊為自己的監視器。

    2.介面回撥

       addXXXListener(XXXListener listener)方法中的引數是一個介面,listener可以引用任何實現了該介面的類所建立的物件,當事件源發生事件時,介面listener立刻回撥被類實現的介面中的某個方法。

    3.方法繫結

       當事件源觸發事件發生後,監視器準確知道去呼叫哪個方法。

    4.保持鬆耦合

       當事件源觸發事件發生後,系統知道某個方法會被執行,但無須關心到底是哪個物件去呼叫了這個方法,因為任何實現介面的類的例項(做為監視器)都可以呼叫這個方法來處理事件。

     

     

    使用MVC結構

    一、

    模型-檢視-控制器(Model-View-Controller),簡稱為MVC

    模型(model)  用於儲存資料的物件。

    檢視(view)   為模型提供資料顯示的物件。

    控制器(controller)處理使用者的互動操作,對於使用者的操作作出響應,讓模型和檢視進行必要的互動,即通過檢視修改、獲取模型中的資料;當模型中的資料變化時,讓檢視更新顯示。

     

    二、MVC結構的使用

    詳見課本P256-P257

     

    對話方塊

    JDialog類和JFrame都是Window的子類,二者的例項都是底層容器。

    JDialog類建立的對話方塊必須要依賴於某個視窗。

    對話方塊分為無模式和有模式兩種。

    有模式的對話方塊:當這個對話方塊處於啟用狀態時,只讓程式響應對話方塊內部的事件,而且將堵塞其它執行緒的執行,使用者不能再啟用對話方塊所在程式中的其它視窗,直到該對話方塊消失不可見。

    無模式對話方塊:當這個對話方塊處於啟用狀態時,能再啟用其它視窗,也不堵塞其它執行緒的執行。

     

    一、訊息對話方塊

    訊息對話方塊是有模式對話方塊,進行一個重要的操作動作之前,最好能彈出一個訊息對話方塊。可以用javax.swing包中的JOptionPane類的靜態方法:

        public static void showMessageDialog(

                           Component parentComponent,

                           String message,

                           String title,

                           int messageType)

        建立一個訊息對話方塊。

     

    二、輸入對話方塊

    輸入對話方塊含有供使用者輸入文字的文字框、一個確認和取消按鈕,是有模式對話方塊 。

         可以用javax.swing包中的JOptionPane類的靜態方法:

      public static

             String showInputDialog(Component parentComponent,

                                          Object message,

                                          String title,

                                          int messageType)

      建立一個輸入對話方塊。

     

    三、確認對話方塊

    確認對話方塊是有模式對話方塊。

        可以用javax.swing包中的JOptionPane類的靜態方法:

    public static int showConfirmDialog(Component parentComponent,

                                        Object message,

                                        String title,

                                        int optionType)

     得到一個確認對話方塊。

     

    四、顏色對話方塊

    可以用javax.swing包中的JColorChooser類的靜態方法: public static Color showDialog(Component component,       

                                            String title,

                                            Color initialColor)

       建立一個有模式的顏色對話方塊  。

     

    五、自定義對話方塊

    1)對話方塊是一個容器,它的預設佈局是BorderLayout,對話方塊可以新增元件,實現與使用者的互動操作。

    2)構造對話方塊的2個常用構造方法

    JDialog() 構造一個無標題的初始不可見的對話方塊,對話方塊依賴一個預設的不可見的視窗,該視窗由Java執行環境提供。

    JDialog(JFrame owner) 構造一個無標題的初始不可見的無模式的對話方塊,owner是對話方塊所依賴的視窗,如果owner取null,對話方塊依賴一個預設的不可見的視窗,該視窗由Java執行環境提供。

     

    樹元件與表格元件

    1.樹元件

    DefaultMutableTreeNode節點

    DefaultMutableTreeNode類的兩個常用的構造方法是:

    DefaultMutableTreeNode(Object userObject)

    DefaultMutableTreeNode(Object userObject,boolean allowChildren)

    樹上的TreeSelectionEvent事件

    使用addTreeSelectionListener(TreeSelectionListener listener)

    方法獲得一個監視器。

    2.表格元件

    JTable有7個構造方法,這裡介紹常用的三個。

         JTable() 建立預設的表格模型。

         JTable(int a,int b) 建立a行,b列的預設模型表格

         JTable (Object data[][],Object  columnName[]) 建立預設表格模型物件,並且顯示由data指定的二維陣列的值,其列名由陣列columnName指定。

     通過對錶格中的資料進行編輯,可以修改表格中二維陣列data中對應的資料資料。在表格中輸入或修改資料後,需按回車或用滑鼠單擊表格的單元格確定所輸入或修改的結果。當表格需要重新整理顯示時,讓表格呼叫repaint方法。

     

    按鈕繫結到鍵盤

    步驟:

    (1) 獲取輸入對映.   按鈕首先呼叫

       public final InputMap getInputMap(int condition) 

       方法返回一個InputMap物件.

    (2)繫結按鈕的鍵盤操作.   步驟(1)返回的輸入對映首先呼叫方法

       public void put(KeyStroke keyStroke,Object actionMapKey)

      將敲擊鍵盤上的某鍵指定為按鈕的鍵盤操作.

    (3)為按鈕的鍵盤操作指定監視器.    按鈕呼叫方法

        public final ActionMap getActionMap()

        返回一個ActionMap物件:

        ActionMap actionmap = button.getActionMap();

        然後,該物件actionmap呼叫方法:

        public void put(Object key,Action action)

        為按鈕的鍵盤操作指定監視器

     

    列印元件

    步驟:

    1.獲取ToolKit物件

           讓元件呼叫getToolkit()方法返回系統提供的Toolkit物件。

    2.獲得PrintJob物件

           Toolkit物件呼叫getPrintJob()方法返回一個PrintJob物件。

    3.獲取Graphics物件

           PrintJob物件使用getGraphics()方法獲得一個Graphics物件。

    4.列印元件

          步驟3獲取的Graphics物件是g,元件呼叫

           paintAll(g)

           將打印出該元件及其子元件。如果呼叫方法:

           pain(g)

           將打印出該元件本身,但不列印子元件

     

    釋出GUI程式

    可以使用jar.exe把一些檔案壓縮成一個JAR檔案,來發布我們的應用程式。

    步驟:

           1.首先用文字編輯器(比如Windows下的記事本)編寫一個清單檔案 ,副檔名為.mf,如Mymoon.mf 。

           2.生成JAR檔案

    如果目錄test下的位元組碼檔案剛好是應用程式需要的全部位元組碼檔案,也可以如下生成JAR檔案:

     D:\test\jar cfm Tom.jar Mymoon.mf  *.class

    可以將Tom.jar檔案複製到任何一個安裝了java執行環境的計算機上,只要用滑鼠雙擊該檔案就可以執行該java應用程式了。