照着书上写的代码,问题出在哪里呢?为什么运行不出来,该怎么修改呀?
package 第12章示例;
import java. util. * ;
import 第9章38.Employee38;
/* *
*类EmployeeCatalog维护员工信息目录
*获得包含类{@link Employee}的对象集合
**@author author
*@version1.1.0
*@see Employee
*/public class EmployeeCatalog38 implements Iterable<Employee38>{
//创建一个 ArrayList 存放 Employee 对象
private ArrayList<Employee38> employees;
/* *
构造一个空的 ArrayList
/public EmployeeCatalog()
{this. employees ==new ArrayList<Employee>();
}
/* *
*添加一个新的对象到employees中
**@param employee
* Employee 对象
*/public void addEmployee(Employee38 employee){
this. employees. add(employee);
}/* *
*返回employees 对象的游标类
* @return an@link Iterator} of{@link Employee}
*/public Iterator<Employee38> iterator(){return this. employees. iterator();}
/* *
*返回具有给定 id 号的员工信息
* @param id
*员工的编号 id
* @return employee
* 具有给定编号的雇员对象
* 如果给定的员工编号没有找到,则返回空
*/public Employee38 getEmployee(String id) {
for(Employee employee : this. employees) {
if(employee. getId().equals(id)){
return employee;
}}
return null;}
/* *
*返回 ArrayList 中存放的 Employee 对象个数
*
* @return ArrayList 中存放的Employee 对象个数
*/
public int getNumberOfEmployees(){
return this. employees. size();
}
/* *
*返回一个包含该目录中所有员工的id号的数组
* @return arrayOfIds
*一个包含该目录中所有员工的id号的数组
*/
public String[] getIds(){
//构造String数组,存放所有员工的id号
String[] arrayOfIds = new String[getNumberOfEmployees()] ;
int i = 0;
for(Employee38 employee:this.employees){
arrayOfIds[(i++)] = employee. getId();
}
return arrayOfIds;
}}
package 第12章示例;
import java.io.* ;
import java.awt. *;
import java. text. *;
import java.util. * ;
import javax. swing. *;
import javax. swing. event. * ;
import 第9章38.Employee38;
/**
* 类EmployeeManagerGUI 构建图形界面
* 使用图形界面的方式显示员工的基本信息
* @author author
* @version1.1.0
* @see Employee
* @see EmployeeCatalog
* @see EmployeeLoader
* @see FileEmployeeLoader,
* @see DataFormatException*
* @see DataField
*/
public class EmployeeManagerGUI38 extends JPanel {
/*标准错误输出流 */
static private PrintWriter stdErr = new PrintWriter(System.err,true);
/*窗口的宽度以像素为单位*/
static private int WIDTH=400;
/*窗口的高度以像素为单位*/
static private int HEIGHT=240;
/*列表单元的像素宽度 */
static private int CELL_SIZE=60;
/*列表中可见的行数 */
static private int LIST_ROWS=6;
/*状态文本区域的行数 */
static private int STATUS_ROWS = 4;
/*状态文本区域的列数 */
static private int STATUS_COLS=40;
/*显示员工列表 */
private JList employeeList;
/*显示员工id列表 */
private JPanel employeeIdPanel;
/*显示员工基本信息 */
private JPanel employeePanel;
/*显示状态信息 */
private JTextArea statusTextArea;
/*存放员工目录*/
private EmployeeCatalog38 employeeCatalog;
/**
*启动图形界面显示主程序,设定图形窗口的基本信息
*
* @param args
*字符串参数,未用到
* @throws IOException
*读入数据出现问题,抛出该异常
* @throws ParseException
*雇员生日数据格式转换出现问题,抛出该异常
*/
public static void main(String[] args)throws IOException,ParseException{
//存放雇员基本信息文件的文件名
String filename="";
//从运行参数中获得存放雇员基本信息文件的文件名
if (args.length!=1){
filename = "Employee. dat";
} else {
filename= args[0];
}
try {}
/**
//从文件名为filename的文件中读入员工信息
EmployeeCatalog employeeCatalog(new FileEmployeeLoader())
. loadCatalog(filename);
//设定窗口的标题
JFrame frame= new JFrame("公司雇员信息管理系统");
//设定图形窗口的显示内容
frame. setContentPane(new EmployeeManagerGUI(employeeCatalog));
//设定默认关闭操作
frame. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE);
//设定图形窗口的大小
frame. setSize(WIDTH,HEIGHT);
//得到图形窗口的大小
Dimension frameSize =frame getSize();
//得到屏幕的尺寸
Dimension screenSize =Toolkit. getDefaultToolkitO.getScreenSize);
int centerX = screenSize. width/2;
int centerY = screenSize. height/2;
int halfWidth = frameSize.width/2;
int halfHeight = frameSizeheight/2;
//将图形界面定位到屏幕中央
frame. setLocation(centerX-halfWidth,centerY-halfHeight);
//设定图形窗口的大小可变
frame. setResizable(true);
// 图形窗口可见
frame. setVisible(true);
}catch(FileNotFoundException fnfe){
stdErr.println("文件不存在");
System.exit(1);
}catch (DataFormatException dfe){
stdErr.println("文件中包含错误格式信息:"+dfe.getMessage());
System.exit(1);
}}
/* *
*实例化图形界面的部件和窗口.
* @param iCatalog
*a employee catalog.
*
*/
public EmployeeManagerGUI38(EmployeeCatalog38 iCatalog) {
employeeCatalog=iCatalog;
//新建JList存放员工目录
employeeList=newJList(employeeCatalog. getIds());
//设定JList的选择模式为单选
employeeList.setSelectionMode(ListSelectionModelSINGLE_SELECTION);
//设定JList的可见列表索引个数
employeeList.setVisibleRowCount(LIST_ROWS);
employeeList. setFixedCellWidth(CELLSIZE);
/×atusTextArea 显示提示信息
statusTextArea=new JTextArea(STATUS_ROWSSTATUS_COLS);
//设定statusTextArea 不可编辑
statusTextArea. setEditable(false);
//创建显示员工基本信息面板
employeePanel=newJPanelO;
//设定employeePanel的标题
employeePanel.setBorder(BorderFactory.createTitledBorder("员工基本信息"));
//employeeldPanel存放员工id列表
employeeIdPanel=new JPanel();
//设定employeeIdPanel的标题
employeeIdPanel.setBorder(BorderFactory.createTitledBorder("员工号"));
// 将存放员工 id 号的 JList 添加到 employeeIdPanel 中
employeeldPanel.add(newJScrollPane(employeeList));
//设定布局管理器
setLayout(new BorderLayout());
// 将部件添加到窗口中
add(employeeIdPanel,BorderLayout. WEST);
add(employeePanel,BorderLayout.CENTER);
add(statusTextArea, BorderLayout.SOUTH);
// 为JList 添加事件监听器
employeeList. addListSelectionListener(new EmployeeListListener());
}
/* *
*类EmployeeListListener
*监听JList 的选择并处理List选择事件
*/
class EmployeeListListener implements ListSelectionListener{
/* *
*显示选择的员工的基本信息。
*@param event
*事件对象.
*/
public void valueChanged(ListSelectionEvent event) {
//获得被选择员工的员工号
String id=(String)employeeList. getSelectedValue();
//获得被选择员工的基本信息
Employee38 employee=employeeCatalog.getEmployee38(id);
//清空员工基本信息面板
employeePanel.removeAll();
employeePanel.setVisible(false);
//显示被选择员工的基本信息
employeePanel.add(getDataFieldsPanel(employee.getDataFields()));
employeePanel.setVisible(true);
//在状态区显示基本信息面板的当前状态
statusTextArea. setText("Employee" + id
+"'s information list as above.");
}
}
/* *
*获取包含员工基本信息的JPanel 对象
* @param dataFields
*包含员工基本信息的ArrayList
* @return employeeInfo
*
*包含员工基本信息的JPanel 对象
*/
private JPanel getDataFieldsPanel(ArrayList<DataField> dataFields) {
//创建一个 JPanel 对象存放员工基本信息
JPanel employeenfo=new JPanel();
//设定JPanel的布局管理器
employeeInfo. setLayout(new BorderLayout());
//新建两个JPanel 对象,left显示信息类型,right显示员工信息
JPanel left = new JPanel();
JPanel right =new JPanel();
//设定left 和 right的大小
left. setPreferredSize(new Dimension(80,220));
right. setPreferredSize(new Dimension(200,220));
left.setLayout(new GridLayout(11,0)); right. setLayout(new GridLayout(11,0));
//使用Iterator遍历dataFields取得员工信息
for (DataField employee: dataFields){
//JLabel显示信息类型
JLabel eInfoName=new JLabel();
//JTextField显示对应类型的信息
JTextField eInfo=new JTextField();
eInfo. setEditable(false);
//设定JLabel和JTextField的内容
eInfoName. setText(employee.getName() +":");
eInfo. setText(employee. getValue());
//将JLabel 和JTextField 添加到 JPanel容器中
left. add(eInfoName);
right.add(eInfo);
//将left和right添加到employeeInfo中
employeeInfo. add(left,BorderLayout.WEST);
employeeInfo. add(right,BorderLayout.EAST);
//返回包含员工信息的 JPanel
return employeeInfo;
}
}