Java編程——圖形程序設計
目錄:
- 基礎知識
- 窗體組件類結構
- Swing和AWT對比
- 組件(Component & JComponent)
- 頂層窗體(Frame & JFrame)
- 工具類(Toolkit)
- 窗口(Window)
- 字體(Font)
- 圖形(Graphics)
- 容器(Container)
- 按鈕(JButton)
- 選擇組件(多選按鈕、單選按鈕、下拉框)
- 對話框(JDialog)
- 下拉框(JComboBox)
- 文本輸入(文本框、密碼框、文本域、標籤和標籤組件)
- 事件處理(event)
- 設計模式
- 佈局管理器
一、基礎知識
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(窗體)
- java.awt.Dialog(對話框)
- javax.swing.JComponent(組件)
- java.awt.Container(容器對象)
- java.awt.Component(圖形對象)
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;