java的設計思想
(設計思想,是需要不斷領悟的。。。)
一、封裝
學java的人都知道這是向對象的編程語言,從字面上理解,就是針對對象的一些操作,將具有某一特性的實體封裝成一個類或者是將具有一定功能的方法,抽取出來封裝成一個供外面調用的方法,然後通過new這個類或方法生成對象,最後通
過對對象進行操作或者實現相應的功能。如將一個人封裝成一個人的類,人有屬性:性別,年齡,出生日期,家庭住址等,外界對人進行操作時,只能改變其屬性值,但是不能改變屬性的種類,這要更安全,而且當對人進行操作時,也是連帶屬性
一起進行操作,這就是面向對象的編程。
所以java的設計思想一般離不開封裝,如做一個項目,首先對項目的每個子系統進行封裝,然後對子系統中的每個模塊進行封裝,最後對每個模塊中的每個組件(組件:能完成某一特定功能的方法)進行封裝,這裏的子系統、模塊、組件都是
一個封裝體,這樣做不僅能使項目做起來更加有條理,更加安全,而且讓後面的維護和更改更加方便、簡單、易操作。(後面有項目的實例)
二、設計的基本原則
★ 面向接口編程
a、這是Java編程裏面大家公認的第一原則。
b、接口很重要的一個功能:封裝隔離
c、接口是功能塊或封裝塊的外觀
接口及相關機制最基本的作用:通過接口可以實現不相關類的相同行爲,而不需要考慮這些類之間的層次關係。根據接口可以瞭解對象的交互界面,而不需要了解對象所屬的類。
面向對象程序設計講究“提高內聚,鬆散耦合”,那麼不同的程序模塊怎麼相互訪問呢,就是通過接口,也就是接口是各部分對外的統一外觀。接口在Java程序設計中體現的思想就是封裝隔離,因爲接口只是描述一個統一的行爲,所以開發人員在面
向接口編程時並不關心具體的實現。
由以上講到的接口的作用和基本思想可以看到,接口在面向對象的Java程序設計中佔有舉足輕重的地位。事實上在設計階段最重要的任務之一就是設計出各部分的接口,然後通過接口的組合,形成程序的基本框架結構。
注:對於行爲模型,優先選用接口,儘量少用抽象類
既爲約束子類的功能,又要提供一些公共的功能,就選用抽象類
★ 優先使用對象組合而非類繼承
★ 分層
最典型的:三層結構
① 表現層功能:展示數據、人機交互、收集參數調用邏輯層。
② 邏輯層功能:進行數據的邏輯校驗、進行邏輯判斷、實現業務功能、處理相關功能、處理後續流程、組織數據返回給表現層。
③ 數據層功能:實現數據持久化、實現對象和持久化數據的雙向映射。
★ 層間交互的基本原則
① 表現層調用邏輯層,邏輯層調用數據層,不可以反過來。
② 層間交互也應該通過接口進行調用,以確保各層的實現獨立變化。
★ 開閉原則
簡單點說就是對新增開放,對修改關閉。而且應儘量做到不用修改模塊的源代碼,就能更改模塊的行爲。
★ 依賴性倒置原則
這個原則就是依賴抽象而不要依賴具體實現。
★ 接口隔離原則
這個原則就是不要使用通用的接口,而是爲不同的用戶使用不同的接口。
★ 替換原則
這個原則就是子類應當可以替換父類並出現在父類能夠出現的任何地方。
三、大神們的基本經驗
★ 類要單一
所設計的類功能要單一 ,一個類應該是描述一類極其相關的屬性和方法。
★ 加強內聚,鬆散耦合
指一個類,能夠在自己內部實現的功能就自己內部實現,不要去調其它類,儘量減少與其它類的依賴關係。
★ 好的封裝性
不必對外開放的部分,一律不對外開放。如果在不確定屬性權限的情況下,先把類的屬性設成private,用的時候再開。
★ 類的粒度要合理
Java規範中建議,一個類的大小不要超過1000行,一個方法的大小不要超過100行。
★ 實現類不能依賴它的使用類
一個類依賴(使用或調用)了另一個類,那麼在另一個類中就不能反過來再依賴當前類。
★ 應考慮靈活性,也就是可配置、可維護
用戶的需求是會不斷改變的,後期的修改與維護是不可避免的,因此軟件開發時就要考慮靈活性。
★ 要考慮性能,考慮可伸縮性
要權衡速度與資源耗費之間的關係,要考慮軟件能夠在一定範圍內可伸縮。
★ 要考慮今後可能的變化,也就是可擴展性
可擴展性指該應用程序能夠很方便地添加新的功能。
★ 要考慮合理的複用
要儘量考慮複用,但也不能光考慮複用,不能把其它的設計原則都丟掉了。
★ 要合理的考慮接口和抽象類的使用
優先使用接口,如果既想約束子類的行爲,又要爲子類提供公共的功能時,採用抽象類。
★ 儘量減少類與協作類的交互次數和交互信息的量
類之間不要反覆地調用,不要每次傳很多的數據。
★ 父類不應知道子類的信息,子類必須知道父類的信息
★ 訪問對象必須通過接口,不能繞過接口直接去訪問
四、實例
功能:圖形界面的個人信息管理系統,實現增、刪、改、查等功能,而且將相關信息存在文件中。
設計思想:每個功能一個模塊,也就是一個封裝體。
表現層:
addressApp.java(主界面)
設置界面的大體框架,如菜單,和麪板,標題等
package cn.hncu.addressManage;
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Event;
import java.awt.BorderLayout;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.KeyStroke;
import java.awt.Point;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JFrame;
import javax.swing.JDialog;
import cn.hncu.addressManage.UI.ListPanel;
public class addressApp {
private JFrame jFrame = null;
private JPanel jContentPane = null;
private JMenuBar jJMenuBar = null;
private JMenu fileMenu = null;
private JMenu editMenu = null;
private JMenu helpMenu = null;
private JMenuItem exitMenuItem = null;
private JMenuItem aboutMenuItem = null;
private JMenuItem cutMenuItem = null;
private JMenuItem copyMenuItem = null;
private JMenuItem pasteMenuItem = null;
private JMenuItem saveMenuItem = null;
private JDialog aboutDialog = null;
private JPanel aboutContentPane = null;
private JLabel aboutVersionLabel = null;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
addressApp application = new addressApp();
application.getJFrame().setVisible(true);
}
});
}
/**
* This method initializes jFrame
*
* @return javax.swing.JFrame
*/
private JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setJMenuBar(getJJMenuBar());
jFrame.setSize(800, 650);
jFrame.setContentPane(getJContentPane());
jFrame.setTitle("Application");
}
return jFrame;
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
//把我們的ListPanel加到jContentPane中
jContentPane.add(new ListPanel(jFrame,null,false));
//jContentPane.remove(listPanel)
}
return jContentPane;
}
/**
* This method initializes jJMenuBar
*
* @return javax.swing.JMenuBar
*/
private JMenuBar getJJMenuBar() {
if (jJMenuBar == null) {
jJMenuBar = new JMenuBar();
jJMenuBar.add(getFileMenu());
jJMenuBar.add(getEditMenu());
jJMenuBar.add(getHelpMenu());
}
return jJMenuBar;
}
/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getFileMenu() {
if (fileMenu == null) {
fileMenu = new JMenu();
fileMenu.setText("File");
fileMenu.add(getSaveMenuItem());
fileMenu.add(getExitMenuItem());
}
return fileMenu;
}
/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getEditMenu() {
if (editMenu == null) {
editMenu = new JMenu();
editMenu.setText("Edit");
editMenu.add(getCutMenuItem());
editMenu.add(getCopyMenuItem());
editMenu.add(getPasteMenuItem());
}
return editMenu;
}
/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getHelpMenu() {
if (helpMenu == null) {
helpMenu = new JMenu();
helpMenu.setText("Help");
helpMenu.add(getAboutMenuItem());
}
return helpMenu;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getExitMenuItem() {
if (exitMenuItem == null) {
exitMenuItem = new JMenuItem();
exitMenuItem.setText("Exit");
exitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
return exitMenuItem;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getAboutMenuItem() {
if (aboutMenuItem == null) {
aboutMenuItem = new JMenuItem();
aboutMenuItem.setText("About");
aboutMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JDialog aboutDialog = getAboutDialog();
aboutDialog.pack();
Point loc = getJFrame().getLocation();
loc.translate(20, 20);
aboutDialog.setLocation(loc);
aboutDialog.setVisible(true);
}
});
}
return aboutMenuItem;
}
/**
* This method initializes aboutDialog
*
* @return javax.swing.JDialog
*/
private JDialog getAboutDialog() {
if (aboutDialog == null) {
aboutDialog = new JDialog(getJFrame(), true);
aboutDialog.setTitle("About");
aboutDialog.setContentPane(getAboutContentPane());
}
return aboutDialog;
}
/**
* This method initializes aboutContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getAboutContentPane() {
if (aboutContentPane == null) {
aboutContentPane = new JPanel();
aboutContentPane.setLayout(new BorderLayout());
aboutContentPane.add(getAboutVersionLabel(), BorderLayout.CENTER);
}
return aboutContentPane;
}
/**
* This method initializes aboutVersionLabel
*
* @return javax.swing.JLabel
*/
private JLabel getAboutVersionLabel() {
if (aboutVersionLabel == null) {
aboutVersionLabel = new JLabel();
aboutVersionLabel.setText("Version 1.0");
aboutVersionLabel.setHorizontalAlignment(SwingConstants.CENTER);
}
return aboutVersionLabel;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getCutMenuItem() {
if (cutMenuItem == null) {
cutMenuItem = new JMenuItem();
cutMenuItem.setText("Cut");
cutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
Event.CTRL_MASK, true));
}
return cutMenuItem;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getCopyMenuItem() {
if (copyMenuItem == null) {
copyMenuItem = new JMenuItem();
copyMenuItem.setText("Copy");
copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
Event.CTRL_MASK, true));
}
return copyMenuItem;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getPasteMenuItem() {
if (pasteMenuItem == null) {
pasteMenuItem = new JMenuItem();
pasteMenuItem.setText("Paste");
pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
Event.CTRL_MASK, true));
}
return pasteMenuItem;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getSaveMenuItem() {
if (saveMenuItem == null) {
saveMenuItem = new JMenuItem();
saveMenuItem.setText("Save");
saveMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
Event.CTRL_MASK, true));
}
return saveMenuItem;
}
}
ListPanel.java
清單面板,包括數據的顯示,和數據的相關操作按鈕
package cn.hncu.addressManage.UI;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import cn.hncu.addressManage.business.MySet;
import cn.hncu.utils.Panels;
public class ListPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JLabel jLabel = null;
private JButton btnToAdd = null;
private JFrame jf=null;
private JList jListAddress = null;
private JButton btnToUpdate = null;
private JButton btnToDelete = null;
private JButton btnToQuery = null;
private Object objs[]; // @jve:decl-index=0:
private boolean isQuery;
/**
* This is the default constructor
*/
public ListPanel(JFrame jf,Object objs[],boolean isQuery) {
super();
this.jf = jf;
this.objs = objs;
this.isQuery = isQuery;
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
jLabel = new JLabel();
jLabel.setBounds(new Rectangle(294, 39, 202, 39));
jLabel.setFont(new Font("Dialog", Font.BOLD, 24));
jLabel.setForeground(Color.red);
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
jLabel.setText("我的地址本信息");
this.setSize(800, 600);
this.setLayout(null);
this.add(jLabel, null);
this.add(getBtnToAdd(), null);
this.add(getJListAddress(), null);
this.add(getBtnToUpdate(), null);
this.add(getBtnToDelete(), null);
this.add(getBtnToQuery(), null);
}
/**
* This method initializes btnToAdd
*
* @return javax.swing.JButton
*/
private JButton getBtnToAdd() {
if (btnToAdd == null) {
btnToAdd = new JButton();
btnToAdd.setFont(new Font("Dialog", Font.BOLD, 18));
btnToAdd.setSize(new Dimension(120, 41));
btnToAdd.setLocation(new Point(83, 448));
btnToAdd.setMnemonic(KeyEvent.VK_UNDEFINED);
btnToAdd.setText("轉到新增");
btnToAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
//界面切換
jf.getContentPane().removeAll();
jf.getContentPane().add(new AddPanel( jf ));
jf.getContentPane().validate();
}
});
}
return btnToAdd;
}
/**
* This method initializes jListAddress
*
* @return javax.swing.JList
*/
private JList getJListAddress() {
if (jListAddress == null) {
jListAddress = new JList();
jListAddress.setBounds(new Rectangle(181, 116, 369, 216));
//爲列表添加內容
if(!this.isQuery){
MySet mySet = new MySet();
objs= mySet.getAll();
}
jListAddress.setListData(objs);
}
return jListAddress;
}
/**
* This method initializes btnToUpdate
*
* @return javax.swing.JButton
*/
private JButton getBtnToUpdate() {
if (btnToUpdate == null) {
btnToUpdate = new JButton();
btnToUpdate.setBounds(new Rectangle(259, 446, 126, 46));
btnToUpdate.setFont(new Font("Dialog", Font.BOLD, 18));
btnToUpdate.setText("轉到修改");
btnToUpdate.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
String updateStr = (String)jListAddress.getSelectedValue();
if(updateStr==null){
Panels.changePanel(jf, new ErrorPanel(jf,ListPanel.this));
}else{
//界面切換
jf.getContentPane().removeAll();
jf.getContentPane().add(new UpdatePanel( jf,updateStr ));
jf.getContentPane().validate();
}
}
});
}
return btnToUpdate;
}
/**
* This method initializes btnToDelete
*
* @return javax.swing.JButton
*/
private JButton getBtnToDelete() {
if (btnToDelete == null) {
btnToDelete = new JButton();
btnToDelete.setBounds(new Rectangle(429, 446, 124, 46));
btnToDelete.setFont(new Font("Dialog", Font.BOLD, 18));
btnToDelete.setText("轉到刪除");
btnToDelete.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
// jf.getContentPane().removeAll();
// jf.getContentPane().add(new DeletePanel());
// jf.getContentPane().validate();
String deleteStr = (String)(jListAddress.getSelectedValue());
if(deleteStr==null){
Panels.changePanel(jf, new ErrorPanel(jf,ListPanel.this));
}else{
//System.out.println(deleteStr);
Panels.changePanel(jf, new DeletePanel(jf,deleteStr));
}
}
});
}
return btnToDelete;
}
/**
* This method initializes btnToQuery
*
* @return javax.swing.JButton
*/
private JButton getBtnToQuery() {
if (btnToQuery == null) {
btnToQuery = new JButton();
btnToQuery.setBounds(new Rectangle(617, 445, 121, 46));
btnToQuery.setFont(new Font("Dialog", Font.BOLD, 18));
btnToQuery.setText("轉到查詢");
btnToQuery.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
Panels.changePanel(jf, new QueryPanel(jf));
}
});
}
return btnToQuery;
}
}
AddPanel.java
當點擊添加按鈕時,就會跳到這個面板中
package cn.hncu.addressManage.UI;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import cn.hncu.addressManage.business.MySet;
public class AddPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JLabel jLabel = null;
private JLabel jLabel1 = null;
private JTextField tfdName = null;
private JLabel jLabel2 = null;
private JTextField tfdAge = null;
private JLabel jLabel3 = null;
private JTextField tfdAddress = null;
private JButton btnAdd = null;
private JButton btnBack = null;
private JFrame mainFrame = null;
/**
* This is the default constructor
*/
public AddPanel(JFrame mainFrame) {
super();
this.mainFrame = mainFrame;
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
jLabel3 = new JLabel();
jLabel3.setBounds(new Rectangle(111, 292, 57, 35));
jLabel3.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel3.setText("地址:");
jLabel2 = new JLabel();
jLabel2.setBounds(new Rectangle(109, 222, 54, 44));
jLabel2.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel2.setText("年齡:");
jLabel1 = new JLabel();
jLabel1.setBounds(new Rectangle(112, 147, 51, 45));
jLabel1.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel1.setText("姓名:");
jLabel = new JLabel();
jLabel.setBounds(new Rectangle(339, 41, 160, 49));
jLabel.setFont(new Font("Dialog", Font.BOLD, 24));
jLabel.setForeground(Color.red);
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
jLabel.setForeground(Color.blue);
jLabel.setText("地址本添加");
this.setSize(800, 600);
this.setLayout(null);
this.add(jLabel, null);
this.add(jLabel1, null);
this.add(getTfdName(), null);
this.add(jLabel2, null);
this.add(getTfdAge(), null);
this.add(jLabel3, null);
this.add(getTfdAddress(), null);
this.add(getBtnAdd(), null);
this.add(getBtnBack(), null);
}
/**
* This method initializes tfdName
*
* @return javax.swing.JTextField
*/
private JTextField getTfdName() {
if (tfdName == null) {
tfdName = new JTextField();
tfdName.setBounds(new Rectangle(191, 148, 145, 47));
}
return tfdName;
}
/**
* This method initializes tfdAge
*
* @return javax.swing.JTextField
*/
private JTextField getTfdAge() {
if (tfdAge == null) {
tfdAge = new JTextField();
tfdAge.setBounds(new Rectangle(187, 223, 153, 45));
}
return tfdAge;
}
/**
* This method initializes tfdAddress
*
* @return javax.swing.JTextField
*/
private JTextField getTfdAddress() {
if (tfdAddress == null) {
tfdAddress = new JTextField();
tfdAddress.setBounds(new Rectangle(184, 290, 215, 41));
}
return tfdAddress;
}
/**
* This method initializes btnAdd
*
* @return javax.swing.JButton
*/
private JButton getBtnAdd() {
if (btnAdd == null) {
btnAdd = new JButton();
btnAdd.setSize(new Dimension(134, 49));
btnAdd.setText("新增");
btnAdd.setFont(new Font("Dialog", Font.BOLD, 18));
btnAdd.setLocation(new Point(112, 388));
btnAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
add(); // TODO Auto-generated Event stub actionPerformed()
}
});
}
return btnAdd;
}
private JButton getBtnBack() {
if (btnBack == null) {
btnBack = new JButton();
btnBack.setSize(new Dimension(134, 49));
btnBack.setText("返回");
btnBack.setFont(new Font("Dialog", Font.BOLD, 18));
btnBack.setLocation(new Point(445, 387));
btnBack.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
back();
}
});
}
return btnBack;
}
//把所有的處理方法寫在這裏
//地址信息添加
private void add(){
//1收集參數
String name = tfdName.getText();
String age = tfdAge.getText();
int iAge = 0;
try {
iAge = Integer.parseInt(age);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this, "年齡數據格式錯誤!!");
return;
}
String address = tfdAddress.getText();
//2組織參數
String str = name +","+iAge+","+address;
//3調用邏輯層
MySet mySet = new MySet();
boolean flag = mySet.add(str);
//4根據邏輯層的返回結果,導向不同的頁面
if(flag){//添加成功,返回到ListPanel界面進行顯示
back();
}else{
this.mainFrame.getContentPane().removeAll();
this.mainFrame.getContentPane().add(new ErrorPanel(mainFrame,this));
this.mainFrame.getContentPane().validate();
}
}
//返回到主界面
private void back() {
this.mainFrame.getContentPane().removeAll();
this.mainFrame.getContentPane().add(new ListPanel(this.mainFrame,null,false));
this.mainFrame.getContentPane().validate();
}
}
修改面板
package cn.hncu.addressManage.UI;
import java.awt.Font;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import cn.hncu.addressManage.business.MySet;
public class UpdatePanel extends JPanel {
private static final long serialVersionUID = 1L;
private JLabel jLabel = null;
private JTextField tfdName = null;
private JLabel jLabel1 = null;
private JTextField tfdAge = null;
private JLabel jLabel2 = null;
private JTextField tfdAddress = null;
private JButton btnUpdate = null;
private JButton btnBack = null;
private JFrame mainFrame=null;
private String updateStr=""; // @jve:decl-index=0:
private String strs[];
public UpdatePanel(JFrame mainFrame, String updateStr) {
super();
this.mainFrame = mainFrame;
this.updateStr = updateStr;
strs = updateStr.split(",");
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
jLabel2 = new JLabel();
jLabel2.setBounds(new Rectangle(121, 281, 56, 45));
jLabel2.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel2.setText("地址:");
jLabel1 = new JLabel();
jLabel1.setBounds(new Rectangle(123, 183, 56, 45));
jLabel1.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel1.setText("年齡:");
jLabel = new JLabel();
jLabel.setBounds(new Rectangle(129, 96, 49, 41));
jLabel.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel.setText("姓名:");
this.setSize(800, 600);
this.setLayout(null);
this.add(jLabel, null);
this.add(getTfdName(), null);
this.add(jLabel1, null);
this.add(getTfdAge(), null);
this.add(jLabel2, null);
this.add(getTfdAddress(), null);
this.add(getBtnUpdate(), null);
this.add(getBtnBack(), null);
}
/**
* This method initializes tfdName
*
* @return javax.swing.JTextField
*/
private JTextField getTfdName() {
if (tfdName == null) {
tfdName = new JTextField();
tfdName.setBounds(new Rectangle(191, 96, 139, 48));
tfdName.setText(strs[0]);
}
return tfdName;
}
/**
* This method initializes tfdAge
*
* @return javax.swing.JTextField
*/
private JTextField getTfdAge() {
if (tfdAge == null) {
tfdAge = new JTextField();
tfdAge.setBounds(new Rectangle(197, 180, 140, 53));
//應該解析,異常處理
tfdAge.setText(strs[1]);
}
return tfdAge;
}
/**
* This method initializes tfdAddress
*
* @return javax.swing.JTextField
*/
private JTextField getTfdAddress() {
if (tfdAddress == null) {
tfdAddress = new JTextField();
tfdAddress.setBounds(new Rectangle(196, 280, 160, 51));
tfdAddress.setText(strs[2]);
}
return tfdAddress;
}
/**
* This method initializes btnUpdate
*
* @return javax.swing.JButton
*/
private JButton getBtnUpdate() {
if (btnUpdate == null) {
btnUpdate = new JButton();
btnUpdate.setBounds(new Rectangle(119, 403, 122, 48));
btnUpdate.setFont(new Font("Dialog", Font.BOLD, 18));
btnUpdate.setText("修改");
btnUpdate.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
update();
}
});
}
return btnUpdate;
}
/**
* This method initializes btnBack
*
* @return javax.swing.JButton
*/
private JButton getBtnBack() {
if (btnBack == null) {
btnBack = new JButton();
btnBack.setBounds(new Rectangle(354, 402, 127, 51));
btnBack.setFont(new Font("Dialog", Font.BOLD, 18));
btnBack.setText("返回");
btnBack.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
back();
}
});
}
return btnBack;
}
//返回到主界面
private void back() {
this.mainFrame.getContentPane().removeAll();
this.mainFrame.getContentPane().add(new ListPanel(this.mainFrame,null,false));
this.mainFrame.getContentPane().validate();
}
//////////////程序的邏輯處理方法///////////////
/**
* 記錄修改的事件處理方法
*/
private void update() {
//1收集參數
String name = tfdName.getText();
String age = tfdAge.getText();
int iAge = 0;
try {
iAge = Integer.parseInt(age);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this, "年齡數據格式錯誤!!");
return;
}
String address = tfdAddress.getText();
//2組織參數
String str = name +","+iAge+","+address;
//3調用邏輯層
MySet mySet = new MySet();
boolean flag = mySet.update(str,updateStr);
//4根據邏輯層的返回結果,導向不同的頁面
if(flag){//修改成功,返回到ListPanel界面進行顯示
back();
}else{
//如果修改後的記錄在mySet中已存在,則返回false,導向出錯頁面.
//如果被修改的記錄不存在,也是返回false,導向出錯頁面
this.mainFrame.getContentPane().removeAll();
this.mainFrame.getContentPane().add(new ErrorPanel(mainFrame,this));
this.mainFrame.getContentPane().validate();
}
}
}
刪除面板
package cn.hncu.addressManage.UI;
import java.awt.Font;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import cn.hncu.addressManage.business.MySet;
import cn.hncu.utils.Panels;
public class DeletePanel extends JPanel {
private static final long serialVersionUID = 1L;
private JLabel jLabel = null;
private JLabel jLabel1 = null;
private JTextField tfdName = null;
private JLabel jLabel2 = null;
private JTextField tfdAge = null;
private JLabel jLabel3 = null;
private JTextField tfdAddress = null;
private JButton btnDelete = null;
private JButton btnBack = null;
private JFrame mainFrame = null;
private String strs[] = null;
private String deleteStr=""; // @jve:decl-index=0:
/**
* This is the default constructor
*/
public DeletePanel(JFrame mainFrame, String deleteStr) {
super();
this.mainFrame = mainFrame;
this.deleteStr = deleteStr;
strs = deleteStr.split(",");
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
jLabel3 = new JLabel();
jLabel3.setBounds(new Rectangle(167, 323, 58, 32));
jLabel3.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel3.setText("地址:");
jLabel2 = new JLabel();
jLabel2.setBounds(new Rectangle(164, 242, 53, 43));
jLabel2.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel2.setText("年齡:");
jLabel1 = new JLabel();
jLabel1.setBounds(new Rectangle(166, 161, 58, 45));
jLabel1.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel1.setText("姓名:");
jLabel = new JLabel();
jLabel.setBounds(new Rectangle(377, 67, 182, 53));
jLabel.setFont(new Font("Dialog", Font.BOLD, 24));
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
jLabel.setText("刪除地址");
this.setSize(800, 600);
this.setLayout(null);
this.add(jLabel, null);
this.add(jLabel1, null);
this.add(getTfdName(), null);
this.add(jLabel2, null);
this.add(getTfdAge(), null);
this.add(jLabel3, null);
this.add(getTfdAddress(), null);
this.add(getBtnDelete(), null);
this.add(getBtnBack(), null);
tfdName.setText(strs[0]);
tfdAge.setText(strs[1]);
tfdAddress.setText(strs[2]);
}
/**
* This method initializes tfdName
*
* @return javax.swing.JTextField
*/
private JTextField getTfdName() {
if (tfdName == null) {
tfdName = new JTextField();
tfdName.setBounds(new Rectangle(239, 161, 177, 45));
}
return tfdName;
}
/**
* This method initializes tfdAge
*
* @return javax.swing.JTextField
*/
private JTextField getTfdAge() {
if (tfdAge == null) {
tfdAge = new JTextField();
tfdAge.setBounds(new Rectangle(241, 240, 179, 46));
}
return tfdAge;
}
/**
* This method initializes tfdAddress
*
* @return javax.swing.JTextField
*/
private JTextField getTfdAddress() {
if (tfdAddress == null) {
tfdAddress = new JTextField();
tfdAddress.setBounds(new Rectangle(246, 319, 231, 42));
}
return tfdAddress;
}
/**
* This method initializes btnDelete
*
* @return javax.swing.JButton
*/
private JButton getBtnDelete() {
if (btnDelete == null) {
btnDelete = new JButton();
btnDelete.setBounds(new Rectangle(138, 455, 131, 52));
btnDelete.setFont(new Font("Dialog", Font.BOLD, 18));
btnDelete.setText("刪除");
btnDelete.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
boolean flag = new MySet().delete(deleteStr);
if(flag){
Panels.changePanel(mainFrame, new ListPanel(mainFrame,null,false));
}else{
Panels.changePanel(mainFrame, new ErrorPanel(mainFrame,DeletePanel.this));
}
}
});
}
return btnDelete;
}
/**
* This method initializes btnBack
*
* @return javax.swing.JButton
*/
private JButton getBtnBack() {
if (btnBack == null) {
btnBack = new JButton();
btnBack.setBounds(new Rectangle(399, 456, 146, 50));
btnBack.setFont(new Font("Dialog", Font.BOLD, 18));
btnBack.setText("返回");
btnBack.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
Panels.changePanel(mainFrame, new ListPanel(mainFrame,null,false));
}
});
}
return btnBack;
}
}
查詢面板
package cn.hncu.addressManage.UI;
import java.awt.GridBagLayout;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import javax.swing.JButton;
import cn.hncu.addressManage.business.MySet;
import cn.hncu.utils.Panels;
public class QueryPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JLabel jLabel = null;
private JLabel jLabel1 = null;
private JLabel jLabel11 = null;
private JLabel jLabel12 = null;
private JTextField tfdName = null;
private JTextField tfdAge = null;
private JTextField tfdAddress = null;
private JLabel jLabel2 = null;
private JTextField tfdAge2 = null;
private JButton btnQuery = null;
private JButton btnBack = null;
private JFrame mainFrame = null;
/**
* This is the default constructor
*/
public QueryPanel(JFrame mainFrame) {
super();
this.mainFrame = mainFrame;
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
jLabel2 = new JLabel();
jLabel2.setBounds(new Rectangle(417, 264, 88, 43));
jLabel2.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel2.setText("最大年齡:");
jLabel12 = new JLabel();
jLabel12.setBounds(new Rectangle(120, 347, 48, 47));
jLabel12.setText("地址:");
jLabel12.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel11 = new JLabel();
jLabel11.setBounds(new Rectangle(118, 264, 94, 44));
jLabel11.setText("最小年齡:");
jLabel11.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel1 = new JLabel();
jLabel1.setBounds(new Rectangle(123, 177, 50, 49));
jLabel1.setFont(new Font("Dialog", Font.BOLD, 18));
jLabel1.setText("姓名:");
jLabel = new JLabel();
jLabel.setBounds(new Rectangle(365, 68, 146, 54));
jLabel.setFont(new Font("Dialog", Font.BOLD, 24));
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
jLabel.setText("地址本查詢");
this.setSize(800, 600);
this.setLayout(null);
this.add(jLabel, null);
this.add(jLabel1, null);
this.add(jLabel11, null);
this.add(jLabel12, null);
this.add(getTfdName(), null);
this.add(getTfdAge(), null);
this.add(getTfdAddress(), null);
this.add(jLabel2, null);
this.add(getTfdAge2(), null);
this.add(getBtnQuery(), null);
this.add(getBtnBack(), null);
}
/**
* This method initializes tfdName
*
* @return javax.swing.JTextField
*/
private JTextField getTfdName() {
if (tfdName == null) {
tfdName = new JTextField();
tfdName.setBounds(new Rectangle(201, 176, 173, 48));
}
return tfdName;
}
/**
* This method initializes tfdAge
*
* @return javax.swing.JTextField
*/
private JTextField getTfdAge() {
if (tfdAge == null) {
tfdAge = new JTextField();
tfdAge.setBounds(new Rectangle(250, 262, 104, 49));
}
return tfdAge;
}
/**
* This method initializes tfdAddress
*
* @return javax.swing.JTextField
*/
private JTextField getTfdAddress() {
if (tfdAddress == null) {
tfdAddress = new JTextField();
tfdAddress.setBounds(new Rectangle(196, 354, 212, 43));
}
return tfdAddress;
}
/**
* This method initializes tfdAge2
*
* @return javax.swing.JTextField
*/
private JTextField getTfdAge2() {
if (tfdAge2 == null) {
tfdAge2 = new JTextField();
tfdAge2.setBounds(new Rectangle(514, 265, 154, 45));
}
return tfdAge2;
}
/**
* This method initializes btnQuery
*
* @return javax.swing.JButton
*/
private JButton getBtnQuery() {
if (btnQuery == null) {
btnQuery = new JButton();
btnQuery.setBounds(new Rectangle(175, 445, 162, 59));
btnQuery.setFont(new Font("Dialog", Font.BOLD, 18));
btnQuery.setText("查詢");
btnQuery.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
query();
}
});
}
return btnQuery;
}
protected void query() {
//1收集參數
//姓名
String name = tfdName.getText().trim();
//年齡,因爲可能範圍查詢,所以用兩個參數。應該進行異常處理,此處省略
String strAge1 = tfdAge.getText().trim();
String strAge2 = tfdAge2.getText().trim();
int age1 =-1;
int age2 =10000;
if (strAge1!=null && strAge1.length()>0) {
try {
age1 = Integer.parseInt(strAge1);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this, "最小年齡格式出錯");
return;
}
}
if (strAge2!=null && strAge2.length()>0) {
try {
age2 = Integer.parseInt(strAge2);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this, "最大年齡格式出錯");
return;
}
}
//地址
String address = tfdAddress.getText().trim();
//2組織參數
String queryStr = name+","+age1+","+age2+","+address;
//3調用邏輯層
MySet mySet = new MySet();
System.out.println("queryStr:"+queryStr);
Object tmpObjs[] = mySet.query(queryStr);
for(Object obj: tmpObjs){
System.out.print(obj+" ");
}
//4根據邏輯層的調用結果,導向不同的顯示界面
if(tmpObjs!=null){
Panels.changePanel(mainFrame, new ListPanel(mainFrame,tmpObjs,true));
}
}
/**
* This method initializes btnBack
*
* @return javax.swing.JButton
*/
private JButton getBtnBack() {
if (btnBack == null) {
btnBack = new JButton();
btnBack.setBounds(new Rectangle(440, 448, 151, 57));
btnBack.setFont(new Font("Dialog", Font.BOLD, 18));
btnBack.setText("返回");
btnBack.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
Panels.changePanel(mainFrame, new ListPanel(mainFrame,null,false));
}
});
}
return btnBack;
}
}
當出錯時彈出的面板。出錯情況:當修改和刪除時,沒有選中要操作的項,就視爲出錯
package cn.hncu.addressManage.UI;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JButton;
import cn.hncu.utils.Panels;
public class ErrorPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JLabel jLabel = null;
private JButton btnBack = null;
private JFrame jf=null;
private JPanel jp=null;
/**
* This is the default constructor
*/
public ErrorPanel( JFrame jf, JPanel jp) {
super();
this.jf = jf;
this.jp = jp;
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
jLabel = new JLabel();
jLabel.setBounds(new Rectangle(283, 291, 302, 107));
jLabel.setFont(new Font("Dialog", Font.BOLD, 72));
jLabel.setBounds(new Rectangle(248, 219, 302, 107));
jLabel.setForeground(Color.magenta);
jLabel.setText("杯具啦。。。");
this.setSize(800, 600);
this.setLayout(null);
this.add(jLabel, null);
this.add(getBtnBack(), null);
}
/**
* This method initializes btnBack
*
* @return javax.swing.JButton
*/
private JButton getBtnBack() {
if (btnBack == null) {
btnBack = new JButton();
btnBack.setBounds(new Rectangle(401, 465, 129, 58));
btnBack.setFont(new Font("Dialog", Font.BOLD, 18));
btnBack.setText("返回");
btnBack.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
Panels.changePanel(jf,jp);
}
});
}
return btnBack;
}
}
Panels.java
公共面板
package cn.hncu.utils;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Panels {
public static void changePanel(JFrame jf, JPanel panel){
jf.getContentPane().removeAll();
jf.getContentPane().add(panel);
//jf.getContentPane().validate();
jf.getContentPane().repaint();
}
}
邏輯層:
MySet.java
package cn.hncu.addressManage.business;
import cn.hncu.addressManage.dao.FileManage;
public class MySet {
private static final String FILE_NAME="a.txt";//※※
static Object[] objs=new Object[0];
public boolean add(Object obj){
if(contains(obj)){
return false;
}
Object tempObjs[] = new Object[objs.length+1];
System.arraycopy(objs, 0, tempObjs, 0, objs.length);
tempObjs[objs.length] = obj;
objs = tempObjs;
boolean result = save();//※※
return result;
}
public boolean contains(Object obj){
for(Object o:objs){
if(o.equals(obj)){
return true;
}
}
return false;
}
public Object[] getAll(){
objs = FileManage.readFromFile(FILE_NAME);//※※
return objs;
}
public int size(){
return objs.length;
}
public boolean update(Object obj, Object oldObj) {
if(contains(obj)){
return false;
}
for(int i=0; i<objs.length;i++){
if(oldObj.equals(objs[i])){
objs[i]=obj;
boolean result = save();//※※
return result;
}
}
return false;
}
public boolean delete(Object obj) {
//1判斷是否存在
if(!contains(obj)){
return false;
}
//2創建一個新的數組,長度爲原來的長度減1
Object tempObjs[] = new Object[objs.length-1];
//3把原來數組中“非刪除對象”移到新的數組中
int k=0;
for(int i=0; i<objs.length; i++){
if(!obj.equals(objs[i])){
tempObjs[k++] = objs[i];
}
}
//4把新的數組賦值給原來的數組對象
objs = tempObjs;
boolean result = save();//※※
return result;
}
public Object[] query(String queryStr) {
//解析查詢參數
String strs[]= new String[4];
String ss[] = queryStr.split(",");
int j=0;
for(String s: ss){
strs[j++] = s;
}
Object tmpObjs[] = new Object[objs.length];
int age11 = Integer.parseInt(strs[1]);
int age12 = Integer.parseInt(strs[2]);
int k=0;
for(int i=0;i<objs.length;i++){
//解析數據庫中的數據
String strObj = (String)objs[i];
String strsObj[] = strObj.split(",");
//衛條件1:姓名
if(strs[0]!=null && strs[0].length()>0 //先判斷用戶是否輸了合法的查詢項
&& !strsObj[0].contains(strs[0])){ //再過濾不符合用戶輸入條件的
continue;
}
//衛條件2:最小年齡
int age = Integer.parseInt(strsObj[1]);
if(age11>age){
continue;
}
//衛條件3:最大年齡
if(age12<age){
continue;
}
//衛條件4:地址
if(strs[3]!=null && strs[3].length()>0 //先判斷用戶是否輸了合法的查詢項
&& !strsObj[2].contains(strs[3])){ //再過濾不符合用戶輸入條件的
continue;
}
tmpObjs[k++] = objs[i];
}
Object oobjs[] = new Object[k];
for(int i=0;i<k;i++){
oobjs[i] = tmpObjs[i];
}
return oobjs;
}
//※※
private boolean save() {
if(!FileManage.writeToFile(FILE_NAME, objs)){
System.out.println("文件存儲失敗!");
return false;
}else{
return true;
}
}
}
數據層:
FileManage.javapackage cn.hncu.addressManage.dao;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
/*數據層*/
public class FileManage {
public static Object[] readFromFile(String fileName){
ArrayList<Object> arList = new ArrayList<Object>();
ObjectInputStream in = null;
//把數據讀到arList中
try{
in = new ObjectInputStream(new FileInputStream(fileName));
Object obj = null;
while(true){
obj = in.readObject();
arList.add(obj);
}
}catch (Exception e) {
System.out.println("數據已經從文件讀取完畢...");
}finally{
try {
if(in!=null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//把arList中的數據轉換到objs[]中返回
Object objs[] = arList.toArray();
if(objs==null){
objs = new Object[0];
}
return objs;
}
public static boolean writeToFile(String fileName,Object objs[]){
ObjectOutputStream out = null;
try {
out = new ObjectOutputStream(new FileOutputStream(fileName));
for(int i=0;i<objs.length;i++){
out.writeObject(objs[i]);
}
System.out.println("數據已經存儲到文件...");
}catch (IOException e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
}