Java-GUI编程实战之管理系统 Day2【Swing(组件介绍、布局管理器、事件类及监听器类)、基础组件按钮和输入框的用法】
- 視頻、課件、源碼【鏈接:https://pan.baidu.com/s/13ffqGDzH-DZib6-MFViW3Q?提取碼:zjxs】
Java-GUI編程實戰之管理系統 Day2【Swing(組件介紹、布局管理器、事件類及監聽器類)、基礎組件按鈕和輸入框的用法】
Java-GUI編程實戰之管理系統 Day3【學生管理系統GUI設計、學生管理系統增刪改查、項目MVC結構介紹、Java技能圖譜】
目? ?錄
Day02 目錄
Swing 介紹
Swing開發環境準備
idea 使用配置
idea 項目配置
idea 全局配置
Swing組件介紹
Swing布局管理器
Swing事件
Swing事件類及監聽器類
Swing 示例演示
idea 新建項目
JFrame 使用
Dialog 使用
基礎組件按鈕和輸入框的用法
事件 示例
表格 示例
集合數據 轉 二維數組
學生管理系統界面設計示例
Day02 目錄
Swing 介紹
定義
Swing:Java 為GUI應用開發提供的一組工具包,是 Java 基礎類的一部分。
GUI:Graphical User Interface,圖形用戶界面。
AWT:AWT 是抽象窗口組件工具包,是 java 最早的用于編寫圖形節目應用程序的開發包。Swing 是為了解決 AWT 存在的問題而新開發的包,它以 AWT 為基礎的。
MVC架構
Swing 組件遵循模型 - 視圖 - 控制器架構,即MVC架構。
- 模型表示組件的數據
- 視圖表示組件數據的可視化表示形式
- 控制器接受用戶在視圖上的輸入,并且在組件的數據上反映變化
特點
- 豐富的組件, Swing 提供了一組豐富的先進的組件,如樹,頁簽窗體,滑動條,顏色選擇器,表格控件
- 高級自定義,Swing 組件可以用非常簡單的方法來自定義,因為可視化外觀是獨立于內部表示的
- 提供了許多比 AWT 更好的屏幕顯示元素,使用純 Java 實現,能夠更好的兼容跨平臺運行。Swing 組件在javax.swing.*包下,類名均以 J 開頭,如: JFrame、JLabel、JButtonn。
Swing開發環境準備
JDK
- 安裝JDK1.8版本
- 設置JAVA_HOME環境變量
- 驗證JDK安裝是否正確
IDE
- IDEA的安裝及配置
idea 使用配置
idea 項目配置
??
idea 全局配置
??
Swing組件介紹
組件:圖形化界面中的窗口、菜單欄、對話框、標簽、按鈕、文本框等等,這些“元素”統一被稱為 組件(Component)。
- 組件種類:頂層容器、中間容器、基本組件。頂層容器->中間容器->基本組件。基本組件 放在 中間容器 內,中間容器 放在 頂層容器 內。【嵌套關系】
- 組件的繼承關系:頂層容器 屬于窗口類組件,繼承自java.awt.Window;中間容器和基本組件繼承自javax.swing.JComponent。
| 分類 | 組件類 | 說明 | ||
| 頂層容器(窗口組件,圖形界面至少需要一個窗口,可獨立顯示) | JFrame | 窗口(swing開發主要使用 JFrame 作為頂層容器) | ||
| JDialog | 對話框 | |||
| 中間容器(基本組件的載體,必須在頂層容器內,不可獨立顯示) | JPanel | 面板,還有JSplitPane分割面板,JTabbedPane選項卡面板、JScrollPane面板等 | ||
| JMenuBar | 菜單欄,還有彈出菜單JPopupMenu | |||
| JToolBar | 工具欄 | |||
| 基本組件 | JLabel標簽 | JButton按鈕 | JTextField文本框 | JFileChooser文本選取器 |
| JList列表 | JRadioButton單選按鈕 ? | JPasswordField 密碼框 | JColorChooser顏色選取器 | |
| JSlider滑塊 | JToggleButton開關按鈕 ? | JTextArea大文本框 | JCheckBox復選框 | |
| JTable表格 ? | JProgressBar進度條 | JComboBox下拉列表框 | JTree樹 | |
Swing布局管理器
?Swing 中各種組件(JComponent)需要添加到面板容器中(JPanel),面板容器需要指定布局管理器(LayoutManager),明確容器(Container)內的各組件間的排列布局方式。
| 布局管理器類 | 說明 |
| FlowLayout | 流式布局,JPanel的默認布局。根據組件加入順序水平方向排列,排滿一行換下一行繼續排列 |
| GridLayout | 網格布局,用一個矩形網格形式來管理組件,每一個網格按順序放置一個控件 |
| GridBagLayout | 網格袋布局,最靈活的布局管理器類。在不需要相同大小的組件的情況下,GridBagLayout 對象垂直、水平或沿著它們的基線來排列組件 |
| BoxLayout | 箱式布局,將Container中的多個組件按 水平 或 垂直 的方式排列 |
| GroupLayout | 分組布局,組件按層次分組(串行 或 并行),分別確定 組件組 在 水平 和 垂直 方向上的位置 |
| CardLayout | 卡片布局,將容器中的每個組件看作一張卡片,一次只能顯示一張卡片,默認顯示第一張卡片 |
| BorderLayout | 邊界布局,把容器按方位分為 5 個區域(東、西、南、北、中),每個區域放置一個組件,JFrame和JDialog默認布局為BorderLayout。 |
| SpringLayout | 彈性布局,通過定義組件四條邊的坐標位置來實現布局 |
| null | 空布局或絕對布局,通過設置組件在Container中的坐標位置來放置組件 |
- 面板管理器:流式布局?FlowLayout(最常用 對應 面板)...?
- 邊界管理器:邊界布局 BorderLayout(不常用 對應 頂級容器)...
Swing事件
事件:改變對象的狀態被稱為事件,即事件描述源的狀態變化。例如,點擊一個按鈕,移動鼠標,通過鍵盤輸入一個字符,從列表中選擇一個項目、關閉窗口、滾動頁面都是導致一個事件發生的活動。
事件處理:當某個事件發生時(某個Component的某種狀態發生改變時),我們希望在這個時候代碼中能做一些事情,這個就是事件處理。比如在某編輯界面點擊窗口關閉時,彈窗問詢用戶是否確認保存修改。
事件源:引發狀態改變的某個對象,一般是Component。
事件監聽器:監聽器被安裝在某個Component上,負責監聽這個Component具體狀態被改變了。
事件處理流程:
Swing事件類及監聽器類
| 事件類 | 監聽器類 | 描述 |
| ActionEvent | ActionListener | 當單擊按鈕或雙點擊列表的項時,生成 ActionEvent,監聽器接收動作事件 |
| InputEvent | ? | InputEvent 類是所有組件層輸入事件的根事件類 |
| KeyEvent | KeyListener | 在按下一個字符時,按鍵事件生成,監聽器接收按鍵事件 |
| MouseEvent | MouseListener | 監聽器接收鼠標事件 |
| WindowEvent | WindowListener | 這個類的對象代表一個窗口狀態的變化,監聽器接收窗口事件 |
| FocusListener | FocusListener | ? |
Swing 示例演示
- JFrame的用法
- JDiaglog的用法
- JTable的用法
- 基礎組件按鈕和輸入框的用法
- 事件的用法
idea 新建項目
??
??
JFrame 使用
頂層容器-窗口示例,Frame屬于組件類型中的頂層容器。
jFrame.setLocationRelativeTo(null); // 設置窗口在屏幕正中央
jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // 設置關閉窗口時進程退出
Dialog 使用
基礎組件按鈕和輸入框的用法
頂層容器,可以放置面板(中級容器)。
流式布局 FlowLayout
??
事件 示例
添加事件:點擊按鈕后,改變輸入框中的內容。注冊事件編輯器,事件源是JButton。
??
表格 示例
表格:表名、行、列。表格這種基礎組件放在JScrollPane中。
JScrollPane scrollPane = new JScrollPane(); // 創建滾動面板(表格);表格內容太多,表格內容可能超出屏幕高度,所以叫做“滾動面板”,可以從上往下拉,操作頁面美觀。
jTable.setModel(new DefaultTableModel(...)); // 指明表格列名以及每一列對應的數據;數據在前,列名靠后
集合數據 轉 二維數組
添加學生類,構建測試數據。
package cn.itcast.swing;import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.util.ArrayList; import java.util.List;/*** 表格示例*/ public class TableDemo {public static void main(String[] args) {JFrame jFrame = new JFrame("窗口Frame");//創建窗口并指定窗口個名jFrame.setSize(400, 300);//設置窗口的寬和高jFrame.setLocationRelativeTo(null);//設置窗口在屏幕正中央jFrame.setResizable(false);//設置不可調整窗口大小jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//設置關閉窗口時進程退出JScrollPane scrollPane = new JScrollPane();//創建滾動面板(表格)內容太多,表格數據可能超出屏幕高度JTable jTable = new JTable(); // jTable.getTableHeader().setResizingAllowed(false);//設置表格寬度禁止調整/setResizingAllowed:能否拉伸 // jTable.getTableHeader().setReorderingAllowed(false);//設置表格進制拖拽String[] tHeader = {"學生編號", "學生姓名", "學生年齡", "學生地址"};//表的頭//循環構建學生數據List<Student> studentList = new ArrayList<>();for (int i = 1; i <= 100; i++) {Student student = new Student("no." + i, "張三" + i, 20 + i, "北京昌平校區" + i);//創建學生對象studentList.add(student);}String[][] tBody = list2Array(studentList);//表的內容jTable.setModel(new DefaultTableModel(tBody, tHeader)); // 兩個參數:二維數組tBody、表頭tHeaderscrollPane.setViewportView(jTable);//在面板上設置表格視圖jFrame.add(scrollPane);//將panel放入窗口jFrame.setVisible(true);//設置窗口顯示}//集合數據轉為二維數組方法public static String[][] list2Array(List<Student> list) {//根據Student的model與集合數據定義JTable的數據二維數組String[][] tbody = new String[list.size()][4];for (int i = 0; i < list.size(); i++) {Student student = list.get(i);tbody[i][0] = student.getId();tbody[i][1] = student.getName();tbody[i][2] = student.getAge() + "";tbody[i][3] = student.getAddress();}return tbody;} }學生管理系統界面設計示例
絕對布局(絕對定位);? ?this:絕對布局的實例。
??
package cn.itcast.swing;import javax.swing.*; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import java.util.ArrayList;/*** 學生管理系統布局示例*/ public class StudentManagerDemo extends JDialog {public static void main(String[] args) {StudentManagerDemo studentManagerDemo = new StudentManagerDemo();studentManagerDemo.setVisible(true);}public StudentManagerDemo() {this.setTitle("學生管理系統");this.setSize(600, 400);this.setLocationRelativeTo(null);//設置居中this.setResizable(false);this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);this.setLayout(null);//設置布局為絕對布局//表格標題JLabel tableLabel = new JLabel("學生列表");tableLabel.setBounds(265, 20, 70, 25);this.add(tableLabel);//表格JTable table = new JTable();table.getTableHeader().setReorderingAllowed(false); //列不能移動table.getTableHeader().setResizingAllowed(false); //不可拉動表格table.setEnabled(false); //不可更改數據JScrollPane tablePane = new JScrollPane();tablePane.setBounds(50, 50, 500, 200);tablePane.setViewportView(table); //視口裝入表格this.add(tablePane);//字段標題JLabel numberLabel = new JLabel("學生編號");numberLabel.setBounds(50, 250, 70, 25);JLabel nameLabel = new JLabel("學生姓名");nameLabel.setBounds(150, 250, 70, 25);JLabel ageLabel = new JLabel("學生年齡");ageLabel.setBounds(250, 250, 70, 25);JLabel addressLabel = new JLabel("學生地址");addressLabel.setBounds(350, 250, 70, 25);this.add(numberLabel);this.add(nameLabel);this.add(ageLabel);this.add(addressLabel);//增加組件JTextField addNumberText = new JTextField();addNumberText.setBounds(50, 280, 80, 25);JTextField addNameText = new JTextField();addNameText.setBounds(150, 280, 80, 25);JTextField addAgeText = new JTextField();addAgeText.setBounds(250, 280, 80, 25);JTextField addAddressText = new JTextField();addAddressText.setBounds(350, 280, 80, 25);this.add(addNumberText);this.add(addNameText);this.add(addAgeText);this.add(addAddressText);JButton addBtn = new JButton("新增");addBtn.setBounds(460, 280, 90, 25);this.add(addBtn);//修改組件JTextField updateNumberText = new JTextField();updateNumberText.setBounds(50, 310, 80, 25);JTextField updateNameText = new JTextField();updateNameText.setBounds(150, 310, 80, 25);JTextField updateAgeText = new JTextField();updateAgeText.setBounds(250, 310, 80, 25);JTextField updateAddressText = new JTextField();updateAddressText.setBounds(350, 310, 80, 25);this.add(updateNumberText);this.add(updateNameText);this.add(updateAgeText);this.add(updateAddressText);JButton updateBtn = new JButton("修改");updateBtn.setBounds(460, 310, 90, 25);this.add(updateBtn);//刪除組件JTextField delNumberText = new JTextField();delNumberText.setBounds(50, 340, 80, 25);this.add(delNumberText);JButton delBtn = new JButton("刪除");delBtn.setBounds(460, 340, 90, 25);this.add(delBtn);//定義表格頭String[] thead = {"學生編號", "學生姓名", "學生年齡", "學生住址"};//調用adminService的查詢服務ArrayList<Student> dataList = new ArrayList<>();for (int i = 1; i <= 20; i++) {Student student = new Student("no." + i, "student" + i, 20 + i, "北京" + i);dataList.add(student);}//調用list2Array方法,將查詢到的集合轉為數組,方便為JTable賦值String[][] tbody = list2Array(dataList);//將查詢到的結果為table賦值TableModel dataModel = new DefaultTableModel(tbody, thead);table.setModel(dataModel);}//集合數據轉為二維數組方法public static String[][] list2Array(ArrayList<Student> list) {//根據Student的model與集合數據定義JTable的數據二維數組String[][] tbody = new String[list.size()][4];for (int i = 0; i < list.size(); i++) {Student student = list.get(i);tbody[i][0] = student.getId();tbody[i][1] = student.getName();tbody[i][2] = student.getAge() + "";tbody[i][3] = student.getAddress();}return tbody;}}謝謝 黑馬程序員平臺 ~
總結
以上是生活随笔為你收集整理的Java-GUI编程实战之管理系统 Day2【Swing(组件介绍、布局管理器、事件类及监听器类)、基础组件按钮和输入框的用法】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java-GUI编程实战之管理系统 Da
- 下一篇: Java-GUI编程实战之管理系统 Da