背景
昨天實現了一個基於 Java Swing 的招生信息管理系統,這個比以前做的複雜一點,它包含兩個管理功能,通過菜單切換。每個功能都有增、刪、改、查,數據使用文件保存到磁盤中,可在此基礎上添加或修改爲任意新信息的管理功能。
本文來介紹一下這個簡單系統的結構和實現要點,這是運行效果圖。
功能介紹
作爲 Java Swing 學習的練習題,它包含的功能有用戶註冊、登錄;學校招生項目信息管理菜單:增、刪、改、查;用戶預約報班信息管理菜單:增、刪、改、查。
第一步,繪製功能結構圖:
第二,系統登錄後的主頁面,包含兩個一級菜單。
第三,主菜單包括“系統功能” 和“關於”。“系統功能” 對應兩個子管理功能,點擊菜單時跳到對應 List 的 Frame 窗體,列表窗體都含包添加、刪除、修改按鈕。“關於” 菜單,點擊“退出”可結束程序。
培訓項目信息錄入界面:
類圖結構
Swing 實現簡單的信息管理功能,包括增、刪、改、查、列表、數據信息操作類,PrjectListFrame 和 ClassOrderListFrame 所關聯的功能類是一套類似。
所以對整個系統抽取的功能類圖結構如下:
JComboBox 使用坑點
使用 Swing 繪製頁面的時候,發現 Box 是非常好用的容器組件。信息輸入框一般是 label 和文本域,創建一個水平 Box 加入兩個組件即可:
JLabel titleLabel=new JLabel("項目名稱:");
Box titleRow= Box.createHorizontalBox();
titleRow.add(titleLabel);
titleRow.add(titleJText);
本文的應用實現過程中,用到了 JComboBox ,因爲課程預約的項目名稱必須是系統錄入的項目名稱。需要先查詢所有的項目,然後填充到 JComboBox 中,讓用戶選擇,不用文本域,以避免無效數據的產生。
此時,如果還是直接添加到 Box 中的話,佈局就會很難看:
JLabel isChoosenLabel=new JLabel("是否招滿:");
jcomb.addItem("否");
jcomb.addItem("是");
jcomb.setPreferredSize(new Dimension(333, 20));
jp.add(isChoosenLabel);
jp.add(jcomb);
Box isChoosenBox= Box.createHorizontalBox();
isChoosenBox.add(isChoosenLabel);
isChoosenBox.add(jcomb);
直接添加下拉框到 Box 的運行效果圖:
這樣將下拉框放在 Box 中,下拉框的大小是無法控制。
解決方案:查找了一些資料,最終找到的解決方案是,將 JComboBox 放在 JPanel 中,同時設置它的最佳 Size 。
這樣才能讓這一項跟前面對齊,修正添加下拉框的代碼:
JPanel jp=new JPanel();
JLabel isChoosenLabel=new JLabel("是否招滿:");
jcomb.addItem("否");
jcomb.addItem("是");
jcomb.setPreferredSize(new Dimension(333, 20));
jp.add(isChoosenLabel);
jp.add(jcomb);
Box isChoosenBox= Box.createHorizontalBox();
isChoosenBox.add(jp);
jcomb.setPreferredSize(new Dimension(333, 20))
這是關鍵代碼,它可以調整距離 Label 的位置,再運行界面就齊整了:
進一步優化: 測試發現 JComboBox 所在父組件 JPanel 如果不設置大小,那麼它與底部按鈕的距離會很高,導致界面不勻稱。
而且 JPanel 的 setSize
根本不生效 ,只有 jp.setMaximumSize(new Dimension(700, 30));
才能控制面板的大小。
編程啓示錄
對大多數讀者來說,本文只有一個有價值的信息,就是 JComboBox 怎麼和 Box 一起創建一行大小適中的表單界面,可點擊查看運行效果。
核心代碼就是這兩行:
jp.setMaximumSize(new Dimension(700, 30)); // 控制面板大小
jcomb.setPreferredSize(new Dimension(333, 20)); // 控制下拉框大小