Java編程——圖形程序設計

Java編程——圖形程序設計

目錄:

  1. 基礎知識
    1. 窗體組件類結構
    2. Swing和AWT對比
    3. 組件(Component & JComponent)
    4. 頂層窗體(Frame & JFrame)
    5. 工具類(Toolkit)
    6. 窗口(Window)
    7. 字體(Font)
    8. 圖形(Graphics)
    9. 容器(Container)
    10. 按鈕(JButton)
    11. 選擇組件(多選按鈕、單選按鈕、下拉框)
    12. 對話框(JDialog)
    13. 下拉框(JComboBox)
    14. 文本輸入(文本框、密碼框、文本域、標籤和標籤組件)
    15. 事件處理(event)
    16. 設計模式
    17. 佈局管理器

一、基礎知識

1、窗體組件類結構:

  • java.lang.Object
    • java.awt.Component(圖形對象)
      • java.awt.Container(容器對象)
        • javax.swing.JComponent(組件)
          • JPanel(面板,要放在窗體或對話框中)
          • JOptionPane(小對話框)
          • JButton(按鈕)
          • JLabel(標籤)
          • JTextField(文本框)
          • JTextArea(文本域)
          • JPassword(密碼框)
          • JComBox(下拉框)
          • JList(列表框)
          • JCheckBox(多選按鈕)
          • JRadioButton(單選按鈕)
          • JList(列表框)
        • java.awt.Window(窗口)
          • java.awt.Dialog(對話框)
            • java.swing.JDialog(對話框)
          • java.awt.Frame(窗體)
            • java.swing.JFrame(窗體)

2、Swing和AWT對比:

  • AWT(Abstract Window Toolkit,抽象窗口工具箱):基本AWT庫採用將處理用戶界面元素的任務委派給每個目標平臺(Windows等)的本地GUI工具箱的方式,由本地GUI工具箱負責用戶界面元素的創建和動作。因此,觀感的效果依賴於目標平臺。
  • Swing提供能力更強大的用戶界面組件,對底層平臺依賴得很少,因此與平臺相關的bug很少。Swing給予不同平臺的用戶一致的感覺。
  • Swing是指“被繪製的”用戶界面類;AWT是指像事件處理這樣的窗口工具箱的底層機制。

3、組件(Component & JComponent):

  • 常用方法:
    • Dimension getPreferredSize():覆蓋這個方法,返回這個組件的首選大小
    • void setLocation(int x, int y)和setBounds(int x, int y, int width, int height):設置組件的位置
    • void repaint():重新繪製組件
    • void paintComponent(Graphics g):覆蓋這個方法來描述應該如何繪製自己的組件
    • void setBackground(Color c):設置背景顏色
    • void setForeground(Color c):設置前景顏色
    • (JComponent)void revalidate():重新計算組件的位置和大小
    • void setFont(Font f):設置組件的字體

4、頂層窗體(Frame & JFrame):

  • 窗體被設計爲放置組件的容器,可以將菜單欄和其他的用戶界面元素放置在其中。
  • 常用方法:
    • void setLocation(int x, int y)和setBounds(int x, int y, int width, int height):設置框架的位置
    • JFrame void setDefaultCloseOperation(參數):
      • JFrame.HIDE_ON_CLOSE:隱藏窗體,但不停止程序
      • JFrame.DO_NOTHING_ON_CLOSE:無任何操作
      • JFrame.EXIT_ON_CLOSE:隱藏窗體,並停止程序
      • JFrame.DISPOSE_ON_CLOSE:釋放窗體資源
    • void setIconImage(Image image):在標題欄、任務切換窗口等位置顯示哪個圖標
    • void setSize(int width, int height):設置窗體的大小,單位:像素(繼承Window)
    • void setLocation(int width, int height):設置座標,單位:像素(繼承Window)
    • void setBounds(int x, int y, int width, int height):設置窗體座標、大小,單位:像素(繼承Window)
    • void setTitle(String s):改變標題欄的文字
    • void setResizable(boolean b):利用一個boolean值確定窗體的大小是否允許用戶改變
    • Container getContentPane():返回這個JFrame的窗體容器對象
    • Component add(Component c):將一個給定的組件添加到該框架的內容窗格中

5、工具類(Toolkit):

  • static Toolkit getDefaultToolkit():返回默認的工具箱
  • Dimension getScreenSize():返回用戶屏幕的尺寸

6、窗口(Window):

  • 常用方法:
    • void pack():調整窗口大小,要考慮到其他組件的首選大小
    • void toFront():將這個窗口顯示在其他窗口前面
    • void toBack():將這個窗口移動到桌面窗口棧的後面,並相應地重新排列所有的可見窗口
    • void setLocationByPlatform(boolean b):該屬性在窗口顯示之前被設置,由平臺選擇一個合適的位置

7、字體(Font):

  • 常用方法:
    • Font(String name, int style, int size):創建一個新字體對象,style如PLAIN、BOLD、ITALIC、BOLD+ITALIC等

8、圖形(Graphics):

  • 常用方法:
    • void setFont(Font font):設置當前的字體,這種字體被應用於後續的文本繪製操作中。
    • void drawString(String str, int x, int y):採用當前字體和顏色繪製一個字符串。
    • boolean drawImage(Image img, int x, int y, ImageObserver observer):繪製一幅非比例圖像。
    • boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer):繪製一幅比例圖像。系統按照比例將圖像放入給定寬和高的區域。
    • void copyArea(int x, int y, int width, int height, int dx, int dy):拷貝屏幕的一塊區域。

9、容器(Container):

  • 常用方法:
    • void setLayout(LayoutManager m):爲容器設置佈局管理器
    • Component add(Component c):將組件添加到容器中
    • void remove(Component comp):刪除組件
    • void validate():驗證容器中的組件(刷新)
    • void setBackground(Color c):設置背景顏色(繼承Component)

10、按鈕(JButton):

  • 常用方法:
    • void setEnabled(boolean b):按鈕不可點擊爲false,可點擊爲true

11、選擇組件:

  • 多選按鈕(JCheckBox):
    • 用戶通過點擊某個多選按鈕來選擇相應的選項,再點擊則取消複選。當多選按鈕獲得焦點時,用戶也可以通過按空格鍵來切換選擇。
    • 常用方法:
      • boolean isSelected():獲取多選按鈕的選擇狀態(繼承AbstractButton類)
      • void setSelected(boolean b):設置多選按鈕的選擇狀態(繼承AbstractButton類)
  • 單選按鈕(JRadioButton):
    • 爲單選鈕組構造一個ButtonGroup對象。然後,再將JRadioButton類型的對象添加到按鈕組中。按鈕組負責在新按鈕被按下時,取消前一個被按下的按鈕的選擇狀態。
    • ButtonGroup g = new ButtonGroup();
    • g.add(new JRadioButton("按鈕1", false));第二個參數false表明這個按鈕初始狀態是不被選擇
  • 下拉框(JComboBox):
    • 當用戶點擊下拉框時,用戶可以從中進行選擇。
    • 常用方法:
      • comboBox.addItem("身份證");
      • comboBox.addItem("戶口簿");
      • void removeItem(Object item):從選項列表中刪除一個選項
      • 或者使用數組:JComboBox<String> combox = new JComboBox<>(items);//items爲String數組
      • 或者創建下拉列表模型,然後向列表中添加數據模型:ComboBoxModel cm = new DefaultComboxModel<>(items); combox.setModel(cm)
      • comboBox.setBounds(10,10, 80, 20):設置下拉列表座標和大小
      • c.add(comBox);
      • combox.setEditable(true):設置下拉框可編輯

12、對話框(JDialog):

  • 常用方法:
    • Container getContentPane():返回這個JDialog的窗體容器對象
    • 構造方法:JDialog(Frame owner, String title, boolean modal):參數一:父窗體對象;參數二:對話框標題;標題三:是否阻塞父窗體

13、列表框(JList):

  • 常用方法:
    • DefaultListModel<String> model = new DefaultListModel<>();//列表框數據模型
    • for(String tmp:items){model.addElement(tmp);//向數據模型添加元素}
    • 設置選擇模式:
      • jl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION):隨便選
      • jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION):單選
      • jl.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION):只能選擇相鄰的元素
    • 爲列表框添加滾動條:JScrollPane js = new JScrollPane(jl)
    • js.setBounds(10, 10, 100, 100):設置座標和大小
    • jl.getSelectedValuesList():獲取列表框中選中的所有元素

14、文本輸入:

  • 文本框(JTextField):
    • 只能接收單行文本的輸入
    • 常用方法:
      • void setColumns(int columns):設置文本框長度
      • void setFont(Font f):設置字體格式
      • void setText(String t):設置文本(繼承JTextComponent)
      • String getText():獲取文本框中的內容
  • 密碼框(JPasswordField):
    • 只能接收單行文本的輸入,但不會將輸入的內容顯示出來。每個輸入的字符都用回顯字符(echo character)表示。
    • 常用方法:
      • void setColumns(int columns):設置密碼框長度
      • void setFont(Font f):設置字體格式
      • void setEchoChar(char c):設置回顯字符
      • char[] getPassword():獲取密碼的字符數組,String str = new String(ch),將字符數組轉換爲String
  • 文本域(JTextArea):
    • 能接收多行文本的輸入
    • 常用方法:
      • void setFont(Font f):設置字體格式
      • void setColumns(int columns):設定列數,使用setColumns方法改變了一個文本域的大小之後,需要調用包含這個文本框的容器的revalidate方法。調用該方法後,佈局管理器會重新設置容器的大小。
      • void setRows(int rows):設定行數
      • void setText(String t):設置文本(繼承JTextComponent)
      • void append(String str):添加內容
      • void insert(String str, int pos) :插入內容,在第pos個位置之後插入內容
      • void setLineWrap(boolean wrap):設置換行特性,true爲換行
      • JScrollPane js = new JScrollPane(textArea);//給文本域添加滾動條
  • 標籤和標籤組件(JLabel):
    • 標籤時容納文本的組件,它們沒有任何的修飾,也不能響應用戶輸入。可以利用標籤來標識組件。
    • 常用方法:
      • void setText(String text):更改標籤內容
      • void setFont(Font font):設置字體(繼承JComponent)
      • void setIcon(Icon icon):設置圖片

15、事件處理(event):

  • 事件委託模型(event delegation model)在AWT所知的事件範圍內,完全可以控制事件從事件源(event source)到事件監聽器(event listener)的傳遞過程,並將任何對象指派給事件監聽器。
  • AWT事件處理機制:
    • 監聽器對象是一個實現了特定監聽器接口的類的實例。
    • 事件源是一個能夠註冊監聽器對象併發送事件對象的對象。
    • 當事件發生時,事件源將事件對象傳遞給所有註冊的監聽器。
    • 監聽器對象將利用事件對象中的信息決定如何對事件做出響應。
  • 事件監聽器對象通常需要執行一些對其他對象可能產生影響的操作。可以策略性地將監聽器類放置在需要修改狀態的那個類中。
  • java.awt.event將事件分成底層事件(low-level)和語義事件(semantic)
    • 語義事件:表示用戶動作的事件。(點擊按鈕、調節滾動條)
    • 底層事件:形成那些事件的事件。(按下鼠標、拖動鼠標、在按鈕區中拾起鼠標)
  • 常用的5個底層事件:
    • KeyEvent:一個鍵被按下或釋放
    • MouseEvent:鼠標鍵被按下、釋放、移動或拖動
    • MouseWheelEvent:鼠標滾輪被轉動
    • FocusEvent:某個組件獲得焦點或失去焦點
    • WindowEvent:窗口狀態被改變
  • 常用的語義事件:
    • ActionEvent:對應按鈕點擊、菜單選擇、選擇列表項或在文本框中Enter
    • AdjustmentEvent:用戶調節滾動條
    • ItemEvent:用戶從複選框或列表框中選擇一項

16、設計模式:

  • 容器和組件:組合模式(composite)
  • 帶滾動條的面板:裝飾器模式(decorator)
  • 佈局管理器:策略模式(strategy)
  • 模型-視圖-控制器模式(model-view-controller)
    • 模型:存儲內容,必須實現改變內容和查找內容的方法。
    • 視圖:顯示內容,每個視圖可以顯示全部內容的不同部分或不同形式。
    • 控制器:處理用戶輸入事件,然後決定是否把這些事件轉化成對模型或視圖的改變。

17、佈局管理器:

  • 通常,組件放置在容器中,佈局管理器決定容器中的組件具體放置的位置和大小。
    • 絕對定位:不使用任何佈局管理器
      • frame.setLayout(null)
    • 流佈局管理器(Flow Layout manager):面板的默認佈局管理器,將維持每個組件的最佳尺寸。默認是居中佈局
      • c.setLayout(new FlowLayout(FlowLayout.Right, 20, 20)):給容器設置流佈局,右對齊,左右間隔20,上下間隔20。
    • 邊界佈局管理器(Border Layout manager):JFrame窗體的默認佈局管理器,分爲東西南北中(EAST、WEST、SOUTH、NORTH、CENTER常量),默認添加到CENTER區。同一區域的組件會覆蓋。邊框佈局會擴展所有組件的尺寸以便填滿可用空間。
      • frame.add(component, BorderLayout.SOUTH)
    • 網格佈局管理器(Grid Layout manager):按照行列排列所有的組件,每個單元大小都是一樣的。
      • panel.setLayout(new GridLayout(4, 4, 1, 2)):4行4列,水平間距爲1像素,垂直間距爲2像素。如果組件數目多於網格數,網格自動擴展。
    • 網格組佈局管理器(GridBag Layout manager):
      • GridBagLayout gridBag= new GridBagLayout();
      • 容器對象.setLayout(grifBag);
      • GridbagConstraints 約束對象 = new GridbagConstraints();組件的約束
      • 容器對象.add(組件對象, 約束對象);
      • GridBagConstraints常用屬性:
        • gridx, gridy:組件所在的位置
        • gridwidth, gridheight:組件佔用的行數和列數
        • anchor:組件所在的方位
        • fill:組件的填充方式,NONE,HORIZONTAL,VERTICAL,BOTH
        • insets:組件與單元格邊緣的最小距離,top, left, bottom, right
        • ipadx, ipady:組件的首選大小
        • weightx, weighty:一個單元格的最大寬高

參考文獻:

[1]Cay S. Horstmann. Java核心技術 卷Ⅰ基礎知識(原書第10版). [M]北京:機械工業出版社,2016.09;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章