📄 internalwindow.java
字号:
package GradeManagement;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Observable;
import java.util.Observer;
import GradeManagement.model.GradeModel;
import GradeManagement.ui.GradeView;
import GradeManagement.util.MyFileFilter;
import GradeManagement.util.FileReaderWriter;
import GradeManagement.util.SystemConstants;
public class InternalWindow extends JInternalFrame
implements Observer {
private static final int xOffset = 30; // 新窗口偏移x方向
private static final int yOffset = 30; // 新窗口偏移y方向
private static int openFrameCount = 0;
//模型、视图、控制器等属性
private GradeModel gradeModel; // 声明数据模型类
private GradeView gradeView; // 声明视图类
private GradeControl gradeControl; // 声明控制器类
// 与文件管理有关的属性
private JFileChooser fileChooser;
private String fileName;
private String absoluteFilePath;
private boolean saved = true;
// 工具条属性
private MyToolBar toolBar;
private Action saveAction, saveAsAction,addAction,
deleteAction,modifyAction,sortAction;
private JFrame owner;
// 内部窗口类构造方法
public InternalWindow( String title ,JFrame owner) {
super( title + " - " + ( ++openFrameCount ), true, true,
false, true );
this.owner = owner;
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE );
gradeModel = new GradeModel(); // 创建模型对象
gradeView = new GradeView( gradeModel ); // 创建视图类和控制类对象
gradeControl = new GradeControl(owner,gradeModel);
gradeModel.addObserver( this ); //注册内部类对象为观察者
getContentPane().add(new JScrollPane(gradeView), BorderLayout.CENTER);
fileChooser = new JFileChooser(); // 创建fileChooser
fileChooser.setFileFilter( new MyFileFilter()); // 设置文件过滤器
// 设置新窗口位置
setLocation( xOffset * openFrameCount,
yOffset * openFrameCount );
toolBar = new MyToolBar(); // 创建工具条对象
getContentPane().add(toolBar, BorderLayout.NORTH);
setSize( 700, 320 ); // 设置内部窗口大小
} // 构造方法InternalWindow结束
public Action getSaveAction() {
return saveAction;
}
public Action getSaveAsAction() {
return saveAsAction;
}
public void setSaved(boolean saved) {
this.saved = saved;
String title = getTitle();
if ( !title.endsWith(" *") && !isSaved() )
setTitle( title + " *" );
else
if ( title.endsWith( " *" ) && isSaved() )
setTitle( title.substring( 0,
title.length() - 2 ) );
getSaveAction().setEnabled( !isSaved() );
}
public boolean isSaved() {
return saved;
}
public void update(Observable observable, Object object) {
//设置标志,表明学生信息已经修改
setSaved( false );
}
public void setFileName(String file){
fileName = file;
setTitle( fileName );
}
public String getFileName() {
return fileName;
}
public String getAbsoluteFilePath() {
return absoluteFilePath;
}
public void setAbsoluteFilePath( String path ) {
absoluteFilePath = path;
}
public GradeModel getModel() {
return gradeModel;
}
public void setTitle( String title ) {
super.setTitle( title );
}
public boolean close() {
// 如果学生信息变更,提示用户保存
if (!isSaved()) {
int response = JOptionPane.showInternalConfirmDialog(
this, "学生信息已修改,请您选择是否保存? " ,
"确认保存", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE );
// 如用户选择保存,系统保存并关闭窗口
if ( response == JOptionPane.YES_OPTION ) {
saveRoster();
dispose();
return true;
} else if ( response == JOptionPane.NO_OPTION ) {
dispose(); //用户选择否,系统关闭窗口
return true;
}
// 如用户选择取消,系统不作处理
else
return false;
} else { //如信息已保存,直接关闭窗口
dispose();
return true;
}
} // 方法close结束
//从文件载入学生信息
public boolean openRoster() {
//打开JFileChooser对话框
int response = fileChooser.showOpenDialog(this);
if ( response == fileChooser.APPROVE_OPTION ) {
//取回用户选择的文件名
String fileName = fileChooser.getSelectedFile().getAbsolutePath();
//从文件中读取所有学生信息记录
FileReaderWriter fileReader = new FileReaderWriter();
fileReader.open(fileName);
GradeModel student = fileReader.readFile();
fileReader.close();
gradeModel.setModel(student);
// 设置文件名属性
setFileName(fileChooser.getSelectedFile().getName());
// 设置绝对路径属性
setAbsoluteFilePath( fileName );
setSaved(true);
return true;
}
else
return false;
} // 方法openRoster结束
//以文件形式保存学生记录
public void saveRoster() {
//取回文件保存的绝对路径
String fileName = getAbsoluteFilePath();
if ( fileName == null || fileName.equals( "" ) )
saveRosterAs();
// 将学生信息写入文件保存
else {
FileReaderWriter fileReader = new FileReaderWriter();
fileReader.open(fileName);
fileReader.writeFile(gradeModel);
setSaved(true);
fileReader.close();
}
} // 方法saveRoster结束
// 另存为
public void saveRosterAs() {
// 显示另存为对话框
int response = fileChooser.showSaveDialog( this );
if ( response == fileChooser.APPROVE_OPTION ) {
setAbsoluteFilePath(
fileChooser.getSelectedFile().getAbsolutePath() );
setFileName( fileChooser.getSelectedFile().getName() );
FileReaderWriter fileReader = new FileReaderWriter();
fileReader.open(getAbsoluteFilePath());
fileReader.writeFile(gradeModel);
fileReader.close();
setSaved( true );
}
} // 方法saveRosterAs结束
// 销毁内部窗口
public void dispose() {
super.dispose();
}
private class MyToolBar extends JToolBar {
private JButton addButton,deleteButton,modifyButton,sortButton;
private JCheckBox computeCheck;
private JComboBox studentChoice;
public MyToolBar() {
studentChoice = new JComboBox(SystemConstants.STUDENTTYPE);
studentChoice.setToolTipText( "先选择学生类型" );
//注册选择学生类型事件监听器
studentChoice.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent event ) {
String studentType = studentChoice.getSelectedItem().toString();
if(!gradeControl.setType(studentType)){
JOptionPane.showMessageDialog(null, "先选学生类型,再进行其它操作",
"先选学生类型", JOptionPane.ERROR_MESSAGE);
studentChoice.setSelectedItem(gradeControl.getType());
}
}// actionPerformed方法结束
}
);
// 创建保存 Action
Icon saveIcon = new ImageIcon(
InternalWindow.class.getResource("images/save.gif" ) );
saveAction = new AbstractGradeAction( "Save", saveIcon,
"保存", new Integer( 'S' ) ) {
public void actionPerformed(ActionEvent event) {
saveRoster();
}
};
// 创建另存为 Action
Icon saveAsIcon = new ImageIcon(
InternalWindow.class.getResource(
"images/saveAs.gif" ) );
saveAsAction = new AbstractGradeAction( "Save As",
saveAsIcon, "另存为", new Integer( 'A' ) ) {
public void actionPerformed(ActionEvent event) {
saveRosterAs();
}
};
// 实例化增加按钮
addButton = new JButton();
// 创建增加按钮Action
addAction = new AbstractGradeAction( "Add", null,
"增加学生", new Integer( 'A' ) ) {
public void actionPerformed( ActionEvent event ) {
gradeControl.addStudent(owner);
}
};
addButton.setAction( addAction );
// 实例化删除按钮
deleteButton = new JButton();
deleteAction = new AbstractGradeAction( "Delete", null,
"删除", new Integer( 'D' ) ) {
public void actionPerformed( ActionEvent event )
{
gradeControl.deleteStudent();
}
};
deleteButton.setAction( deleteAction );
//实例化修改按钮
modifyButton = new JButton();
modifyAction = new AbstractGradeAction( "Modify", null,
"修改", new Integer( 'M' ) ) {
public void actionPerformed( ActionEvent event )
{
gradeControl.modifyStudent(owner);
}
};
modifyButton.setAction( modifyAction );
//实例化排序按钮
sortButton = new JButton();
sortAction = new AbstractGradeAction( "Sort", null,
"按总成绩排序", new Integer( 'S' ) ) {
public void actionPerformed( ActionEvent event ) {
gradeControl.sort();
}
};
sortButton.setAction( sortAction );
//实例化复选框
computeCheck = new JCheckBox("Compute");
computeCheck.setToolTipText("计算总成绩及平均成绩");
computeCheck.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
if( e.getStateChange() == e.SELECTED)
gradeControl.compute(true);
else
gradeControl.compute(false);
}
}
);
//将Actions、按钮等添加到工具条
add( saveAction );
add( saveAsAction );
addSeparator();
add(studentChoice);
addSeparator();
add( addButton );
add( deleteButton );
add( modifyButton );
addSeparator();
add( sortButton );
add( computeCheck );
setFloatable( false );
} // 构造方法MyToolBar结束
} // 类MyToolBar结束
} // 类InternalWindow结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -