1.1Java Swing GUI组件技术教学参考示例(第5部分)
1.1.1应用Swing JTree类实现真正的目录树组件的应用实例
1、添加一个目录树的子类,类名称为LeftDirectoryTree,包名称为com.px1987.javaapplication.swing.tree,并且继承于javax.swing.JTree类
2、编程该目录树子类
package com.px1987.javaapplication.swing.tree;
import java.awt.Color;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import com.px1987.javaapplication.swing.SwingExplorerMainFrame;
public class LeftDirectoryTree extends JTree {
private SwingExplorerMainFrame oneSwingExplorerMainFrame=null;
public LeftDirectoryTree() {
}
public LeftDirectoryTree(TreeNode root,SwingExplorerMainFrame oneSwingExplorerMainFrame) {
super(root);
this.oneSwingExplorerMainFrame=oneSwingExplorerMainFrame;
}
public static DefaultMutableTreeNode createLeftDirectoryTree(){
DefaultMutableTreeNode directoryName_TreeRoot =new DefaultMutableTreeNode("桌面");
DefaultMutableTreeNode myDocument_FirstLevelNode = new DefaultMutableTreeNode("我的文档");
DefaultMutableTreeNode myComputer_FirstLevelNode = new DefaultMutableTreeNode("我的电脑");
DefaultMutableTreeNode diskC_SecondLevelNode = new DefaultMutableTreeNode("本地磁盘(C:)");
DefaultMutableTreeNode diskD_SecondLevelNode = new DefaultMutableTreeNode("本地磁盘(D:)");
DefaultMutableTreeNode diskE_SecondLevelNode = new DefaultMutableTreeNode("本地磁盘(E:)");
DefaultMutableTreeNode diskF_SecondLevelNode = new DefaultMutableTreeNode("本地磁盘(F:)");
myComputer_FirstLevelNode.add(diskC_SecondLevelNode);
myComputer_FirstLevelNode.add(diskD_SecondLevelNode);
myComputer_FirstLevelNode.add(diskE_SecondLevelNode);
myComputer_FirstLevelNode.add(diskF_SecondLevelNode);
DefaultMutableTreeNode netSystem_FirstLevelNode = new DefaultMutableTreeNode("网上邻居");
DefaultMutableTreeNode cylFile_FirstLevelNode = new DefaultMutableTreeNode("回收站");
directoryName_TreeRoot.add(myDocument_FirstLevelNode);
directoryName_TreeRoot.add(myComputer_FirstLevelNode);
directoryName_TreeRoot.add(netSystem_FirstLevelNode);
directoryName_TreeRoot.add(cylFile_FirstLevelNode);
return directoryName_TreeRoot;
}
public void changeDirectoryTreeStyle(){
DefaultTreeCellRenderer cellRenderer = (DefaultTreeCellRenderer)this.getCellRenderer();
cellRenderer.setOpenIcon(new ImageIcon(getClass().getResource(
"/images/mainframe/menu/fileMenu/open.gif"))); //设置打开状态的图标
cellRenderer.setClosedIcon(new ImageIcon(getClass().getResource(
"/images/mainframe/menu/fileMenu/close.jpg"))); //设置关闭状态的图标
cellRenderer.setLeafIcon(new ImageIcon(getClass().getResource(
"/images/mainframe/menu/fileMenu/new.gif"))); //设置树中叶节点的图标cellRenderer.setBackgroundNonSelectionColor(this.getBackground()); //设置节点选中或者未选中的颜色
cellRenderer.setBackgroundSelectionColor(Color.yellow);
cellRenderer.setBorderSelectionColor(Color.red);
cellRenderer.setTextNonSelectionColor(Color.black);
cellRenderer.setTextSelectionColor(Color.blue);
}
}
注意其中对树节点外观进行绘制(也称为渲染,Renderered)的代码,使用DefaultTreeCellRenderer类可以改变图标、字体以及背景颜色。这些设置是针对所有的结点,比如调用DefaultTreeCellRenderer类中的setOpenIcon()、setCloseIcon()和setLeafIcon()方法,分别实现父节点打开的图片、父节点关闭的图片、以及叶节点的显示图片。
当然,也可以通过实现TreeCellRenderer接口或者继承DefaultTreeCellRenderer类(但DefaultTreeCellRenderer类本身是继承于JLabel类,因此默认的树节点其实是一个JLabel对象),并重写其中的Component getTreeCellRendererComponent(JTree tree, Object value,boolean selected, boolean expanded, boolean leaf, int row,boolean hasFocus)方法,实现对树中的特定结点进行定制以实现特殊的显示效果(比如,将树的每个节点设置成不同的图标)。
3、修改SwingExplorerMainFrame窗口类
package com.px1987.javaapplication.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GraphicsConfiguration;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
import
com.px1987.javaapplication.swing.mainframeevent.SwingExplorerMainFrame_WindowListener; import com.px1987.javaapplication.swing.menu.MainMenuBarAndMenu;
import com.px1987.javaapplication.swing.toolbar.AddressInfoToolBar;
import com.px1987.javaapplication.swing.toolbar.NavigatorToolBar;
import com.px1987.javaapplication.swing.tree.LeftDirectoryTree;
public class SwingExplorerMainFrame extends JFrame {
public SwingExplorerMainFrame() throws HeadlessException {
super();
initThisFrame();
createMainMenuBarMenu();
JPanel contentPanel=new JPanel();
contentPanel.setLayout(new BorderLayout());
this.setContentPane(contentPanel);
createMainToolBar(contentPanel);
this.addWindowListener(new SwingExplorerMainFrame_WindowListener(this));
createCenterJSplitPane(contentPanel);
}
public SwingExplorerMainFrame(GraphicsConfiguration gc) {
super(gc);
initThisFrame();
createMainMenuBarMenu();
}
public SwingExplorerMainFrame(String title) throws HeadlessException {
super(title);
initThisFrame();
createMainMenuBarMenu();
}
public SwingExplorerMainFrame(String title, GraphicsConfiguration gc) {
super(title, gc);
initThisFrame();
createMainMenuBarMenu();
}
private void initThisFrame(){
this.setTitle("利用Java Swing构造的Windows资源管理器");
// this.setSize(400,300);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setFont(new Font("宋体", Font.PLAIN, 12));
Image oneIconImage=Toolkit.getDefaultToolkit().getImage(getClass().
getResource("/images/mainframe/mainframeIconImage.jpg"));
this.setIconImage(oneIconImage);
// this.setResizable(false);
// this.setAlwaysOnTop(true);
// this.setCursor(Cursor.HAND_CURSOR);
this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
}
private void createMainMenuBarMenu(){
MainMenuBarAndMenu oneMainMenuBarAndMenu=new MainMenuBarAndMenu(this);
this.setJMenuBar(oneMainMenuBarAndMenu);
}
private void createMainToolBar(JPanel contentPanel){
NavigatorToolBar oneNavigatorToolBar=new NavigatorToolBar("导航条",this);
AddressInfoToolBar oneAddressInfoToolBar=new AddressInfoToolBar("地址信息条",this);
JPanel toolBarPanel=new JPanel();
toolBarPanel.setLayout(new GridLayout(2,1));
toolBarPanel.add(oneNavigatorToolBar);
toolBarPanel.add(oneAddressInfoToolBar);
contentPanel.add(toolBarPanel,BorderLayout.NORTH);
}
private void createCenterJSplitPane(JPanel contentPanel){
JSplitPane centerSplitPane = null;
centerSplitPane = new JSplitPane();
centerSplitPane.setDividerSize(5);
centerSplitPane.setDividerLocation(200);
contentPanel.add(centerSplitPane);
createLeftDirectoryTreeScrollPane(centerSplitPane);
createRightFileTableScrollPane(centerSplitPane);
}
private void createLeftDirectoryTreeScrollPane(JSplitPane centerSplitPane){ JTree directoryTree=new LeftDirectoryTree(LeftDirectoryTree.createLeftDirectoryTree(),this);
JScrollPane scrollPane=new JScrollPane(directoryTree,
ScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
centerSplitPane.add(scrollPane, JSplitPane.LEFT);
((LeftDirectoryTree)directoryTree).changeDirectoryTreeStyle();
}
private void createRightFileTableScrollPane(JSplitPane centerSplitPane){
}
}
注意:构造完树之后还要把树放在JScollPanel上,否则树显示会有问题。
4、测试现在的效果
5、获得树中的某个结点的路径
TreePath类管理着一个Object引用序列。当拥有一个树路径时,通常只需要知道其终端结点,该结点可以通过getLastPathComponent方法得到。下面为代码示例:TreePath selectionPath = tree.getSelectionPath();
DefaultMutableTreeNode selectedNode1 =
(DefaultMutableTreeNode) selectionPath .getLastPathComponent();
或者通过下面的代码也可以立即返回给定的结点:
DefaultMutableTreeNode selectedNode =
(DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
6、编辑树中的某个结点
在获得选定的结点后,不能通过如下方法来进行编辑:selectedNode.add(newNode);
因为这样只是改变树模型,而相关的视图却没有被通知到。可以使用DefaultTreeModel 类的insertNodeInto方法。
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新增加的某个节点");
int selectedIndex = parent.getIndex(selectedNode);
model.insertNodeInto(newNode, parent, selectedIndex + 1);
7、修改树中的某个节点后更新视图显示
当视图接收到结点结构被改变的通知时,它会更新显示树的视图,但是不会自动展开某个结点以展示新添加的子结点。但可以使用JTree类中的makeVisible方法来实现这个目的,因为makeVisible方法可通过一个树路径让某个结点变成可视的。
TreeNode[] nodes = model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
tree.makeVisible(path);
如果树是放在一个滚动面板里面,则调用。
TreeNode[] nodes = model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
tree.scrollPathToVisible(path);
8、查找树中的某个特定的节点
有时候需要遍历所有子结点来找到相匹配的结点,在DefaultMutableTreeNode类中提供有广度优先和深度优先的遍历方法。它们分别是breadthFirstEnumeration方法和depthFirstEnumeration方法,下面的代码为查找包含有用户对象的某个节点:public DefaultMutableTreeNode findUserObject(Object targetUserObj) {
Enumeration allNodesEnumeration = root.breadthFirstEnumeration();
while (allNodesEnumeration.hasMoreElements()) {
DefaultMutableTreeNode someOneNode =
(DefaultMutableTreeNode)
allNodesEnumeration.nextElement();
if (someOneNode.getUserObject().equals(targetUserObj))
return someOneNode;
}
return null; //没有找到,返回空节点对象
}
1.1.2应用JTable组件实现文件信息显示的表格
1、JTable表格
表格是Swing新增加的组件,主要功能是把数据以二维表格的形式显示出来。使用表格,依据M-V-C的思想,最好先生成一个MyTableModel类型的对象来表示数据,这个类是从AbstractTableModel类中继承来的,其中有几个方法是一定要重写,例如getColumnCount,getRowCount,getColumnName,getValueAt。因为JTable会从这个对象中自动获取表格显示所必需的数据,AbstractTableModel类的对象负责表格大小的确定(行、列)、内容的填写、赋值、表格单元更新的检测等等一切跟表格内容有关的属性及其操作。
JTable类生成的对象以该TableModel为参数,并负责将TableModel对象中的数据以表格的形式显示出来。
2、编程窗口类中的createRightFileTableScrollPane方法
package com.px1987.javaapplication.swing;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GraphicsConfiguration;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import
com.px1987.javaapplication.swing.mainframeevent.SwingExplorerMainFrame_WindowListener;
import com.px1987.javaapplication.swing.menu.MainMenuBarAndMenu;
import com.px1987.javaapplication.swing.toolbar.AddressInfoToolBar;
import com.px1987.javaapplication.swing.toolbar.NavigatorToolBar;
import com.px1987.javaapplication.swing.tree.LeftDirectoryTree;
public class SwingExplorerMainFrame extends JFrame {
public SwingExplorerMainFrame() throws HeadlessException {
super();
initThisFrame();
createMainMenuBarMenu();
JPanel contentPanel=new JPanel();
contentPanel.setLayout(new BorderLayout());
this.setContentPane(contentPanel);
createMainToolBar(contentPanel);
this.addWindowListener(new SwingExplorerMainFrame_WindowListener(this));
createCenterJSplitPane(contentPanel);
}
public SwingExplorerMainFrame(GraphicsConfiguration gc) {
super(gc);
initThisFrame();
createMainMenuBarMenu();
}
public SwingExplorerMainFrame(String title) throws HeadlessException { super(title);
initThisFrame();
createMainMenuBarMenu();
}
public SwingExplorerMainFrame(String title, GraphicsConfiguration gc) { super(title, gc);
initThisFrame();
createMainMenuBarMenu();
}
private void initThisFrame(){
this.setTitle("利用Java Swing构造的Windows资源管理器");
// this.setSize(400,300);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setFont(new Font("宋体", Font.PLAIN, 12));
Image oneIconImage=Toolkit.getDefaultToolkit().getImage(getClass().
getResource("/images/mainframe/mainframeIconImage.jpg"));
this.setIconImage(oneIconImage);
// this.setResizable(false);
// this.setAlwaysOnTop(true);
// this.setCursor(Cursor.HAND_CURSOR);
this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
}
private void createMainMenuBarMenu(){
MainMenuBarAndMenu oneMainMenuBarAndMenu=new MainMenuBarAndMenu(this);
this.setJMenuBar(oneMainMenuBarAndMenu);
}
private void createMainToolBar(JPanel contentPanel){
NavigatorToolBar oneNavigatorToolBar=new NavigatorToolBar("导航条",this);
AddressInfoToolBar oneAddressInfoToolBar=new AddressInfoToolBar("地址信息条",this);
JPanel toolBarPanel=new JPanel();
toolBarPanel.setLayout(new GridLayout(2,1));
toolBarPanel.add(oneNavigatorToolBar);
toolBarPanel.add(oneAddressInfoToolBar);
contentPanel.add(toolBarPanel,BorderLayout.NORTH);
}
private void createCenterJSplitPane(JPanel contentPanel){
JSplitPane centerSplitPane = null;
centerSplitPane = new JSplitPane();
centerSplitPane.setDividerSize(5);
centerSplitPane.setDividerLocation(200);
contentPanel.add(centerSplitPane);
createLeftDirectoryTreeScrollPane(centerSplitPane);
createRightFileTableScrollPane(centerSplitPane);
}
private void createLeftDirectoryTreeScrollPane(JSplitPane centerSplitPane){
JTree directoryTree=new LeftDirectoryTree(LeftDirectoryTree.createLeftDirectoryTree(),this);
JScrollPane scrollPane=new JScrollPane(directoryTree,
ScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS
_NEEDED);
centerSplitPane.add(scrollPane, JSplitPane.LEFT);
((LeftDirectoryTree)directoryTree).changeDirectoryTreeStyle();
}
private void createRightFileTableScrollPane(JSplitPane centerSplitPane){
String tableHead[] = {"名称", "大小", "类型","修改日期","属性"};
Object[][] datasInTable = {
{"someOne.txt", "123456","TXT文件", "2009/10/23", "A"},
{"someOne.java", "34567","JA Va文件", "2009/10/20", "A"}};
JTable fileAttributeTable=new JTable(datasInTable,tableHead);
fileAttributeTable.setShowVerticalLines(false);
fileAttributeTable.setShowHorizontalLines(false);
JScrollPane scrollPane=new JScrollPane(fileAttributeTable,
crollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS
_NEEDED);
centerSplitPane.add(scrollPane, JSplitPane.RIGHT);
}
}
3、再执行观察右面的表格组件
4、应用TableModel包装数据方式创建出表格
(1)类名称为FileTableModel,包名称为com.px1987.javaapplication.swing.table,继承javax.swing.table.AbstractTableModel基类
(2)编程该类
package com.px1987.javaapplication.swing.table;
import javax.swing.table.AbstractTableModel;
public class FileTableModel extends AbstractTableModel {
String tableHead[] = {"名称", "大小", "类型","修改日期","属性"};
Object[][] datasInTable = {
{"someOne.txt", "123456","TXT文件", "2009/10/23", "A"},
{"someOne.java", "34567","JA Va文件", "2009/10/20", "A"}};
public FileTableModel() {
}
@Override
public int getColumnCount() { //获得列的数目
return tableHead.length;
}
@Override
public int getRowCount() { //获得行的数目
return datasInTable.length;
}
//获得某列的名字,而目前各列的名字保存在字符串数组columnNames中@Override
public String getColumnName(int col){
return tableHead[col];
}
@Override //获得某行某列的数据,而数据保存在对象数组datasInTable中public Object getValueAt(int rowIndex, int columnIndex) {
return datasInTable[rowIndex][columnIndex];
}
public Class getColumnClass(int cell) {
return getValueAt(0, cell).getClass();
}
}
(3)修改SwingExplorerMainFrame类中的代码
package com.px1987.javaapplication.swing;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GraphicsConfiguration;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTree;
import
com.px1987.javaapplication.swing.mainframeevent.SwingExplorerMainFrame_WindowListener; import com.px1987.javaapplication.swing.menu.MainMenuBarAndMenu;
import com.px1987.javaapplication.swing.popupmenu.DirectoryTreePopupMenu;
import com.px1987.javaapplication.swing.popupmenu.PopupDirectoryTree_MouseListener; import com.px1987.javaapplication.swing.table.FileTableModel;
import com.px1987.javaapplication.swing.toolbar.AddressInfoToolBar;
import com.px1987.javaapplication.swing.toolbar.NavigatorToolBar;
import com.px1987.javaapplication.swing.tree.LeftDirectoryTree;
public class SwingExplorerMainFrame extends JFrame {
public SwingExplorerMainFrame() throws HeadlessException {
super();
initThisFrame();
createMainMenuBarMenu();
JPanel contentPanel=new JPanel();
contentPanel.setLayout(new BorderLayout());
this.setContentPane(contentPanel);
createMainToolBar(contentPanel);
this.addWindowListener(new SwingExplorerMainFrame_WindowListener(this));
createCenterJSplitPane(contentPanel);
}
public SwingExplorerMainFrame(GraphicsConfiguration gc) {
super(gc);
initThisFrame();
createMainMenuBarMenu();
}
public SwingExplorerMainFrame(String title) throws HeadlessException { super(title);
initThisFrame();
createMainMenuBarMenu();
}
public SwingExplorerMainFrame(String title, GraphicsConfiguration gc) { super(title, gc);
initThisFrame();
createMainMenuBarMenu();
}
private void initThisFrame(){
this.setTitle("利用Java Swing构造的Windows资源管理器");
// this.setSize(400,300);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setFont(new Font("宋体", Font.PLAIN, 12));
Image oneIconImage=Toolkit.getDefaultToolkit().getImage(getClass().
getResource("/images/mainframe/mainframeIconImage.jpg"));
this.setIconImage(oneIconImage);
// this.setResizable(false);
// this.setAlwaysOnTop(true);
// this.setCursor(Cursor.HAND_CURSOR);
this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
}
private void createMainMenuBarMenu(){
MainMenuBarAndMenu oneMainMenuBarAndMenu=new MainMenuBarAndMenu(this);
this.setJMenuBar(oneMainMenuBarAndMenu);
}
private void createMainToolBar(JPanel contentPanel){
NavigatorToolBar oneNavigatorToolBar=new NavigatorToolBar("导航条",this);
AddressInfoToolBar oneAddressInfoToolBar=new AddressInfoToolBar("地址信息条",this);
JPanel toolBarPanel=new JPanel();
toolBarPanel.setLayout(new GridLayout(2,1));
toolBarPanel.add(oneNavigatorToolBar);
toolBarPanel.add(oneAddressInfoToolBar);
contentPanel.add(toolBarPanel,BorderLayout.NORTH);
}
private void createCenterJSplitPane(JPanel contentPanel){
JSplitPane centerSplitPane = null;
centerSplitPane = new JSplitPane();
centerSplitPane.setDividerSize(5);
centerSplitPane.setDividerLocation(200);
contentPanel.add(centerSplitPane);
createLeftDirectoryTreeScrollPane(centerSplitPane);
createRightFileTableScrollPane(centerSplitPane);
}
DirectoryTreePopupMenu oneDirectoryTreePopupMenu=null;
private void createLeftDirectoryTreeScrollPane(JSplitPane centerSplitPane){
JTree directoryTree=new LeftDirectoryTree(LeftDirectoryTree.createLeftDirectoryTree(),this);
JScrollPane scrollPane=new JScrollPane(directoryTree,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
centerSplitPane.add(scrollPane, JSplitPane.LEFT);
((LeftDirectoryTree)directoryTree).changeDirectoryTreeStyle();
oneDirectoryTreePopupMenu=new DirectoryTreePopupMenu(this);
directoryTree.add(oneDirectoryTreePopupMenu);
PopupDirectoryTree_MouseListener onePopupDirectoryTree_MouseListener= new PopupDirectoryTree_MouseListener(directoryTree,
oneDirectoryTreePopupMenu);
directoryTree.addMouseListener(onePopupDirectoryTree_MouseListener);
}
private void createRightFileTableScrollPane(JSplitPane centerSplitPane){ JTable fileAttributeTable=new JTable(new FileTableModel());
fileAttributeTable.setShowVerticalLines(false);
fileAttributeTable.setShowHorizontalLines(false);
JScrollPane scrollPane=new JScrollPane(fileAttributeTable,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
centerSplitPane.add(scrollPane, JSplitPane.RIGHT);
}
}
简答题 1、传统的结构化程序设计的优点和缺点是什么? 优点: (1)这种程序设计方法力求算法描述准确。 (2)对每一子过程模块容易进行程序正确性证明。 缺点: (1)这种程序设计方法本质上是面向“过程”的,而“过程”和“操作”又是不稳定和多变的,因此不能直接反映人类求解问题的思路。 (2)程序代码可重用性差。程序中除少数标准库函数外,每设计一个程序时,程序员几乎从零做起。即使重用代码,通常也是通过拷贝或编辑重新生成一份。 (3)维护程序的一致性困难。该种方法将数据与对数据进行处理的程序代码分离。 2、什么是对象? 每个对象都具有属性(Attribute)和方法(Method)这两方面的特征。对象的属性描述了对象的状态和特征,对象的方法说明了对象的行为和功能,并且对象的属性值只应由这个对象的方法来读取和修改,两者结合在一起就构成了对象的完整描述。 3、什么是消息? 在面向对象的程序设计中,由于对象描述了客观实体,它们之间的联系通过对象间的联系来反映。当一个对象需要另外一个对象提供服务时,它向对方发出一个服务请求,而收到请求的对象会响应这个请求并完成指定的服务。这种向对象发出的服务请求就称为消息。4、什么是多态性? 所谓多态性是指当程序中的其他部分发出同样的消息时,按照接收消息对象的不同能够自动执行类中相应的方法。其好处是,用户不必知道某个对象所属的类就可以执行多态行为,从而为程序设计带来更大方便。 5、什么是面向对象的程序设计方法? 这种方法将设计目标从模拟现实世界的行为转向了模拟现实世界中存在的对象及其各自的行为。 在OOP中,将“对象”作为系统中最基本的运行实体,整个程序即由各种不同类型的对象组成,各对象既是一个独立的实体,又可通过消息相互作用,对象中的方法决定要向哪个对象发消息、发什么消息以及收到消息时如何进行处理等。 6、面向对象方法的特点是什么? (1)OOP以“对象”或“数据”为中心。由于对象自然地反映了应用领域的模块性,因此具有相对稳定性,可以被用作一个组件去构成更复杂的应用,又由于对象一般封装的是某一实际需求的各种成分,因此,某一对象的改变对整个系统几乎没有影响。 (2)引入了“类”(class)的概念。类与类以层次结构组织,属于某个类的对象除具有该类所描述的特性外,还具有层次结构中该类上层所有类描述的全部性质,OOP中称这种机制为继承。 (3)OOP方法的模块性与继承性,保证了新的应用程序设计可在原有对象的数据类型和功能的基础上通过重用、扩展和细化来进行,而不必从头做起或复制原有代码,这样,大大减少了重新编写新代码的工作量,同时降低了程序设计过程中出错的可能性,达到了事半功倍的效果。 7、面向对象的程序设计方法与结构化程序设计方法的比较 (1)传统的结构化程序设计方法以过程为中心构造应用程序,数据和处理数据的过程代码是分离的、相互独立的实体,设计出的程序可重用代码少,且当代码量增加时维护数据和代码的一致性困难。
《面向对象程序设计》 大作业 题目学生成绩管理系统 学院 专业 班级 姓名 指导教师 2015 年11 月11 日
目录 一大作业的目的 (1) 二大作业的内容............................ . .. (2) 三大作业的要求与数据............... ...... . (3) 四大作业应完成的工作.................. . (4) 五总体设计(包含几大功能模块)........... . (5) 六详细设计(各功能模块的具体实现算法——流程图) (6) 七调试分析(包含各模块的测试用例,及测试结果) (7) 八总结 (8) 十参考资料 (9)
一大作业的目的 《面向对象程序设计》是一门实践性很强的课程,通过大作业不仅可以全方位检验学生知识掌握程度和综合能力,而且还可以进一步加深、巩固所学课程的基本理论知识,理论联系实际,进一步培养自己综合分析问题和解决问题的能力。更好地掌握运用C++语言独立地编写、调试应用程序和进行其它相关设计的技能。 二大作业的内容 对学生信息(包括学号、语文、数学、英语、平均分)进行管理,包括学生成绩的信息输入、输出、查询、删除、排序、统计、退出.将学生的成绩信息进行记录,信息内容包含:(1)学生的学号(2)学生的姓名(3)学生的成绩。假设,现收集到了一个班学生的所有成绩信息,要求用C语言编写一个简单的成绩管理系统,可进行录入、查询、修改和浏览等功能。学习相关开发工具和应用软件,熟悉系统建设过程。 三大作业的要求与数据 1、用C++语言实现系统; 2、对学生信息(包括学号、姓名、语文、数学、英语、平均分)进行管理,包括学生成绩的信息输入、输出、查询、删除、排序、统计、退出. 3、学生信息包括:其内容较多,为了简化讨论,要求设计的管理系统能够完成以下功能: (1) 每一条记录包括一个学生的学号、姓名、3门课成绩 (2)、成绩信息录入功能:(成绩信息用文件保存,可以一次完成若干条记录 的输入。) (3)、成绩信息显示浏览功能:完成全部学生记录的显示。 (4)、查询功能:完成按姓名查找学生记录,并显示。 (5)成绩信息的删除:按学号进行删除某学生的成绩. (6)、排序功能:按学生平均成绩进行排序。 (7)、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
1.对象 (1)从概念层面讲,对象是某种拥有责任的抽象。 (2)从规格层面讲,对象是一系列可以被其他对象使用的公共接口。 (3)从语言实现层面讲,对象封装了代码和数据。 2.软件开发中的经典阶段:需求、分析、设计、规范、实现、测试、部署、维护。 3.设计7原则:开闭原则、里氏代换原则、依赖倒转原则、合成/聚合复用原则、 迪M特原则、接口隔离原则、单一职责原则。 4.面向对象的方法学:UML(统一建模语言)、RUP(统一软件开发过程)、XP(极限 编程)。 开发方法:Booch、Coad、OMT、UML、OOSE、Wirfs—Brock 5.OOA——运用面向对象方法进行需求分析。 OOD——运用面向对象方法进行系统设计。 OOP——运用面向对象方法进行程序设计。 6.OOA的基本任务:是运用面向对象的方法,对问题域和系统责任进行分析和理解,对其中的事物和它们之间的关系产生正确的认识,找出描述问题域及系统责任所需的类及对象,定义这些类和对象的属性和操作,以及它们之间所形成的结构、静态联系和动态联系。最终目的:是产生一个符合用户需求,并能够直接反映问题域和系统责任的OOA模型及其详细说明。 优点:(1)加强了对问题域和系统责任的理解。(2)改进与分析有关的各类人员之间的交流。(3)对需求的变化具有较强的适应性。(4)支持软件复用。 OOA的三大策略是:属性策略、方法策略、对象策略。 7.(1)封装:是指对象在其操作中隐藏属性。它是一种信息隐蔽技术,用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的。封装的目的是使对象的使用者和生产者分开,使对象的定义和实现分开。 例如:要从同事那里借钱,在商店购买食物,就不会抢夺同事的钱包,大翻一通,看看里 面是否有足够的钱。而应该询问他们是否可以借你一些钱,他们就会自己翻钱包。 以表示圆的一个对象作为封装的例子。圆的操作应能计算出半径、直径、周长和面积。假定选择存储直径,要访问直径的程序员都会选择存储直径属性,而不是通过“获取直径”的操作来访问。如果在软件的后续版本中要存储的是半径,就必须找出系统中直接访问直径的所有代码,并更正它们,有了封装,就不会有问题。 (2)继承:可以指定类从父类中获取一些特性,再添加它自己的独特特性。继承是类间的 基本关系,它是基于层次关系的不同类共享数据和操作的一种机制。父类中定义了其所有子类的公共属性和操作,在子类中除了定义自己特有的属性和操作外,可以继承父类的属性和操作,也可以对父类中的操作重新定义其实现方法。 例如:在面向对象中,我们可以把洗衣机、电冰箱、微波炉、收音机看成是家用电气类的 子类,也可以说家用电器类是这些类的超类。家用电器类具有的属性OnOffSwitch和electricWire,具有turnOn()和turnOff()操作。因此,如果你知道某物是家用电器,那么就会立即知道它 具有家用电器类的属性和操作,这种关系就是继承。每个家用电器类的子类都继承了家用电器类的特征。同时,每个子类都增加了自己的属性和操作。 (3)多态:是指同一操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。例如:“画”操作,作用在“矩形”对象上,则在屏幕上画一个矩形;作用在“圆”对象上, 则在屏幕上画一个圆。也就是说,相同操作的消息发送给不同对象时,每个对象将根据自1 / 9