Java第二次程序设计作业(第18周末交)
任务:试用JFrame、JMenu、JTable组件等编写一个简单的电子表格软件
要求:利用GUI编程技术、输入输出流技术、多线程技术等,并参考Excel编写一个基于图形界面的简单电子表格软件。参考以下图形界面,文件菜单主要提供从本地打开文件、可以新建文件、保存文件、另存为文件等功能编辑菜单主要完成复制、剪切、粘贴、查找等功能,格式菜单提供对单元格的格式控制等,大部分功能参考Excel进行编写,过于复杂的功能可以不要。当然最重要的是能够打开文件、保存文件和简单的计算功能,其他功能自我发挥,当然在程序中提供帮助菜单和关于子菜单,并在关于子菜单中给出编程者的相关信息。
import java.io.*;
public class CleanClasses {
public static void main(String[] args) {
CleanClasses myapp = new CleanClasses();
myapp.DeleteFiles(new File(System.getProperty("user.dir")));
}
public void DeleteFiles(File file) {
File[] files = file.listFiles();
int count = 0;
for (File f : files){
if (f.isDirectory()){
DeleteFiles(f);
}else if (f.getName().endsWith(".class")){
System.out.println(f.getName()+" has been delete");
count++;
f.delete();}
}
}
}
import javax.swing.table.AbstractTableModel;
import java.util.List;
import java.util.Vector;
public class JTableModel extends AbstractTableModel {
private List<Vector> lists;
private Vector vertor;
public JTableModel(List<Vector> lists) {
this.lists = lists;
}
// 添加行
public void addRow(int index) {
vertor = new Vector();
for (int i = 0; i < getColumnCount(); i++) {
vertor.add(" ");
}
lists.add(index, vertor);
fireTableRowsInserted(index, index);
}
// 删除行
public void removeRow(int rowindex) {
lists.remove(rowindex);
fireTableRowsDeleted(rowindex, rowindex);
}
public Vector getContent(int rowindex) {
return lists.get(rowindex);
}
@Override
public int getRowCount() {
return lists.size();
}
@Override
public int getColumnCount() {
return lists.get(0).size();
}
//获取每一个单元格的数据
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return getContent(rowIndex).get(columnIndex);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Vector vector = lists.get(rowIndex);
vector.set(columnIndex, aValue);
fireTableCellUpdated(rowIndex, columnIndex);
System.out.println(lists.get(rowIndex).get(columnIndex));
}
}
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
public class MyJTable extends JTable {
public static MyJtableCellRender cellRender ;
public MyJTable(TableModel dm) {
super(dm);
setFont(new Font("宋体", Font.PLAIN,18));
setColumnSelectionAllowed(true);
setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
setRowHeight(25);
cellRender = new MyJtableCellRender();
}
public MyJTable(int row, int clo) {
super(row, clo);
setFont(new Font("宋体", Font.PLAIN,18));
setColumnSelectionAllowed(true);
setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
setRowHeight(25);
cellRender = new MyJtableCellRender();
}
@Override
public String getColumnName(int column) {
if (column > 1) {
return (char)(column+64)+"";
}
else {
return "";
}
}
@Override
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
return cellRender;
}
}
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
public class MyJtableCellRender extends DefaultTableCellRenderer {
private Font font; // 字体
private Color backColor; // 背景色
private Color frontColor; // 字体颜色
private int styleModel; // 格式方式
public MyJtableCellRender() {
//设置默认值
font = new Font("宋体", Font.PLAIN, 18);
backColor = Color.WHITE;
frontColor = Color.BLACK;
styleModel = DefaultTableCellRenderer.CENTER;
}
public void setFont(Font font, int row, int col) {
this.font = font;
}
//对齐当时
public void setStyle(int styleModel) {
this.styleModel = styleModel;
}
//背景色
public void setBackColor(Color backColor) {
this.backColor = backColor;
}
//前景色
public void setFrontColor(Color frontColor) {
this.frontColor = frontColor;
}
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
setFont(font); // 设置字体
// setToolTipText("当前内容为" + value.toString()); // 提示信息
setForeground(frontColor); // 前景色
setBackground(backColor); // 背景色
setHorizontalAlignment(styleModel);//设置默认居中
return super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
}
}
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.*;
public class RowHeadJTable extends JTable {
private JTable jTable ;
public RowHeadJTable(JTable jTable, int columnWidth) {
super(new RowHeaderTableModel(jTable.getRowCount()));
this.jTable = jTable;
setRowHeight(25);
this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth);
this.setDefaultRenderer(Object.class, new IsRowHeaderRenderer(jTable, this));
this.setPreferredScrollableViewportSize(new Dimension(columnWidth,40));
}
}
class IsRowHeaderRenderer extends JLabel implements TableCellRenderer, ListSelectionListener {
JTable jTable;
JTable tableShow;
public IsRowHeaderRenderer(JTable jTable, JTable tableShow) {
this.jTable = jTable;
this.tableShow = tableShow;
ListSelectionModel listModel = jTable.getSelectionModel();
listModel.addListSelectionListener(this);
}
public Component getTableCellRendererComponent(JTable table, Object obj,
boolean isSelected, boolean hasFocus, int row, int col) {
((RowHeaderTableModel) table.getModel()).setRowCount(jTable
.getRowCount());
JTableHeader header = jTable.getTableHeader();
this.setOpaque(true);
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setHorizontalAlignment(CENTER);
setBackground(header.getBackground());
if (isSelect(row)) {
setForeground(Color.white);
setBackground(Color.lightGray);
} else {
setForeground(header.getForeground());
}
setFont(header.getFont());
setText(String.valueOf(row + 1));
return this;
}
public void valueChanged(ListSelectionEvent e) {
this.tableShow.repaint();
}
private boolean isSelect(int row) {
int[] sel = jTable.getSelectedRows();
for (int i = 0; i < sel.length; i++)
if (sel[i] == row)
return true;
return false;
}
}
class RowHeaderTableModel extends AbstractTableModel {
private int rowCount;
public RowHeaderTableModel(int rowCount) {
this.rowCount = rowCount;
}
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
public int getRowCount() {
return rowCount;
}
public int getColumnCount() {
return 1;
}
public Object getValueAt(int row, int column) {
return row;
}
}
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class Frame_Main extends JFrame {
private JMenuBar menuBar; // 菜单栏
private ActionListener listener; // 事件监听器
private File file; // 要打开的文件
private FileDialog open; // 文件操作窗口
private MyJTable jTable ;
private MouseListener jTableLitener; // 求和窗口的监听事件
private MouseMotionListener jTableMotionListener;
private String temp = null; // 用于复制 ,剪切, 粘贴操作的中间值
private JPopupMenu menu; // 右键弹出菜单
private java.util.List<Vector> lists ;
private Vector vector ;
private JTableModel model;
private int start_Row , start_Clo , end_Row , end_Clo;
private int result ;
private JMenuItem items[] = new JMenuItem[]{ // 右键菜单项
new JMenuItem("设置背景颜色"),
new JMenuItem("设置字体颜色"),
new JMenuItem("添加行"),
new JMenuItem("删除行"),
new JMenuItem("复制"),
new JMenuItem("剪切"),
new JMenuItem("粘贴"),
};
final JMenu [] menus = new JMenu[]{
new JMenu("文件"),
new JMenu("编辑"),
new JMenu("格式"),
new JMenu("数据"),
new JMenu("关于")
};
final JMenuItem [] [] menuItems = new JMenuItem[][]{
{ // 文件
new JMenuItem("新建"),
new JMenuItem("打开"),
new JMenuItem("保存"),
new JMenuItem("另存为"),
new JMenuItem("退出"),
},
{ // 编辑
new JMenuItem("复制"),
new JMenuItem("剪切"),
new JMenuItem("粘贴"),
new JMenuItem("添加行"),
new JMenuItem("删除行"),
},
{ // 格式
new JMenuItem("前景色"),
new JMenuItem("背景色"),
new JMenuItem("选中背景"),
new JMenuItem("居中"),
new JMenuItem("居左"),
new JMenuItem("居右"),
},
{ //数据
new JMenuItem("求和"),
new JMenuItem("求平均"),
},
{ // 关于
new JMenuItem("关于作者"),
}
};
public Frame_Main(File file) {
this.file = file;
if (file == null) { // 新建
lists = new ArrayList<>();
for (int i = 0; i < 30; i++) {
vector = new Vector();
for (int j = 0; j < 20; j++) {
vector.add(" ");
}
lists.add(vector);
}
} else { //打开
setTitle(file.getAbsolutePath()); // 标题显示为当前打开文件的完整路径
lists = open(file);
}
model = new JTableModel(lists);
jTable = new MyJTable(model);
init();
JScrollPane scrollPane = new JScrollPane(jTable);
scrollPane.setRowHeaderView(new RowHeadJTable(jTable, 40)); // 添加行表头
setJMenuBar(menuBar);
add(scrollPane);
setBackground(Color.WHITE);
jTable.addMouseListener(jTableLitener);
jTable.addMouseMotionListener(jTableMotionListener);
//设置窗口关闭事件
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int option = JOptionPane.showConfirmDialog(null,
"文件已修改,是否保存?", "保存文件?", JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE, null);
switch (option) {
case JOptionPane.YES_NO_OPTION: {
if (file == null) {
saveAs();
} else {
Save(lists,file);
}
break;
}
case JOptionPane.NO_OPTION:
System.exit(0);
}
}
});
setSize(1280,800);
setLocationRelativeTo(null);
setVisible(true);
}
public void init() {
//初始化点击事件监听器 ,包括菜单栏,自定义的工具栏 , 右键菜单
listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int select_row = jTable.getSelectedRow();
int select_column = jTable.getSelectedColumn();
if (e.getActionCommand().equals("前景色")) {
Color selectColor = JColorChooser.showDialog(Frame_Main.this, "选择背景颜色", null);
MyJTable.cellRender.setFrontColor(selectColor);
jTable.updateUI();
}
if (e.getActionCommand().equals("背景色")) {
Color selectColor = JColorChooser.showDialog(Frame_Main.this, "选择背景颜色", null);
MyJTable.cellRender.setBackColor(selectColor);
jTable.updateUI();
}
if (e.getActionCommand().equals("选中背景")) {
Color selectColor = JColorChooser.showDialog(Frame_Main.this, "选择背景颜色", null);
jTable.setSelectionBackground(selectColor);
jTable.updateUI();
}
if (e.getActionCommand().equals("添加行")) {
Vector vector = new Vector();
for (int i = 0; i < lists.get(0).size(); i++) {
vector.add(" ");
}
lists.add(jTable.getSelectedRow(), vector);
model.fireTableRowsInserted(jTable.getSelectedRow(),jTable.getSelectedRow());
}
if (e.getActionCommand().equals("删除行")) {
lists.remove(jTable.getSelectedRow());
model.fireTableRowsDeleted(jTable.getSelectedRow(), jTable.getSelectedRow());
}
if (e.getActionCommand().equals("居中")) {
MyJTable.cellRender.setStyle(DefaultTableCellRenderer.CENTER);
jTable.updateUI();
}
if (e.getActionCommand().equals("居左")) {
MyJTable.cellRender.setStyle(DefaultTableCellRenderer.LEFT);
jTable.updateUI();
}
if (e.getActionCommand().equals("居右")) {
MyJTable.cellRender.setStyle(DefaultTableCellRenderer.RIGHT);
jTable.updateUI();
}
if (e.getActionCommand().equals("设置背景颜色")) {
Color selectColor = JColorChooser.showDialog(Frame_Main.this, "选择字体颜色", null);
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer() {
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
if (row == select_row && column == select_column) {
setBackground(selectColor);
setHorizontalAlignment(CENTER);
} else {
setBackground(Color.WHITE);
}
return super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
}
};
jTable.getColumnModel().getColumn(select_column).setCellRenderer(tcr);
}
if (e.getActionCommand().equals("新建")) {
Frame_Main.this.dispose();
new Frame_Main(null);
}
if (e.getActionCommand().equals("打开")) {
open = new FileDialog(Frame_Main.this, "打开文件", FileDialog.LOAD);
open.setVisible(true);
File file = null;
try {
file = new File(open.getDirectory()+open.getFile());
} catch (Exception e1) {
System.out.println("没有选中文件");
}
Frame_Main.this.dispose();
new Frame_Main(file);
}
if (e.getActionCommand().equals("保存")) {
if (file == null) {
saveAs();
} else {
Save(lists,file);
}
}
if (e.getActionCommand().equals("另存为") ) {
saveAs();
}
if (e.getActionCommand().equals("退出") ) {
System.exit(0);
}
if (e.getActionCommand().equals("求和")) {
result = 0 ;
for (int i = start_Row; i <= end_Row; i++) {
for (int j = start_Clo; j <= end_Clo; j++) {
int s = Integer.valueOf(lists.get(i).get(j).toString().trim());
System.out.println(":"+s+":");
result += s;
}
}
int row, column;
if (end_Row == start_Row) {
row = end_Row;
} else {
row = end_Row + 1;
}
if (end_Clo == start_Clo) {
column = end_Clo;
} else {
column = end_Clo + 1;
}
model.setValueAt(result, row, column);
}
if (e.getActionCommand().equals("求平均")) {
result = 0 ;
int count = 0 ;
for (int i = start_Row; i <= end_Row; i++) {
for (int j = start_Clo; j <= end_Clo; j++) {
int s = Integer.valueOf(lists.get(i).get(j).toString().trim());
result += s;
count++ ;
}
}
int row, column;
if (end_Row == start_Row) {
row = end_Row;
} else {
row = end_Row + 1;
}
if (end_Clo == start_Clo) {
column = end_Clo;
} else {
column = end_Clo + 1;
}
model.setValueAt(result/count, row, column);
}
if (e.getActionCommand().equals("插入新行")) {
model.fireTableRowsInserted(jTable.getSelectedRow(),jTable.getSelectedRow());
}
if (e.getActionCommand().equals("复制")) {
temp = model.getValueAt(jTable.getSelectedRow(), jTable.getSelectedColumn()).toString();
}
if (e.getActionCommand().equals("剪切")) {
temp = model.getValueAt(jTable.getSelectedRow(), jTable.getSelectedColumn()).toString();
model.setValueAt(" ",jTable.getSelectedRow(), jTable.getSelectedColumn());
}
if (e.getActionCommand().equals("粘贴")) {
if (null != temp) {
model.setValueAt(temp,jTable.getSelectedRow(), jTable.getSelectedColumn());
}
}
if (e.getActionCommand().equals("关于作者")) {
//弹出窗口显示信息
JOptionPane.showMessageDialog(Frame_Main.this,
"320130937751\n刘帅彬\n计算机一班\n", "作者信息", JOptionPane.INFORMATION_MESSAGE);
}
}
};
//绑定在JTable下的鼠标事件监听器
jTableLitener = new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
//鼠标释放之后将数据传入到计算面板
//前提是打开计算面板时候的添加监听器
if (e.getButton() == MouseEvent.BUTTON3) {
menu.show(jTable, e.getX(), e.getY());
} else {
int rows[] = jTable.getSelectedRows();
int clos[] = jTable.getSelectedColumns();
start_Row = rows[0];
start_Clo = clos[0];
end_Row = rows[rows.length - 1];
end_Clo = clos[clos.length - 1];
//设置结果
System.out.println(start_Row +":"+start_Clo+":"+end_Row+":"+end_Clo);
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
};
menuBar = new JMenuBar();
for (int i = 0; i < menus.length; i++) {
for (int j = 0; j < menuItems[i].length; j++) {
menuItems[i][j].setFont(new Font("宋体", Font.PLAIN, 15));
menus[i].setFont(new Font("宋体", Font.PLAIN, 15));
menus[i].add(menuItems[i][j]);
menuItems[i][j].addActionListener(listener);
}
menuBar.add(menus[i]);
}
// 初始化菜单栏
menu = new JPopupMenu("菜单测试");
//右键菜单添加事件监听器
for (int i = 0; i < items.length; i++) {
items[i].addActionListener(listener);
items[i].setFont(new Font("宋体", Font.PLAIN, 15));
menu.add(items[i]);
}
}
//另存为方法
public void saveAs() {
open = new FileDialog(Frame_Main.this, "保存文件", FileDialog.SAVE);
open.setVisible(true);
if (open.getFile() != null) {
File newFile = new File(open.getDirectory()+open.getFile() + ".xml");
Save(lists,newFile);
}
}
//读取
public List<Vector> open(File file) {
ArrayList<Vector> lists = new ArrayList<Vector>();
try {
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
Vector content = null;
String str = "";
while ((str = bufferedReader.readLine()) != null) {
String[] arr = str.split(",");
content = new Vector();
for (int i = 0; i < arr.length; i++) {
content.add(arr[i]);
}
lists.add(content);
}
bufferedReader.close();
fileReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return lists;
}
//保存
public void Save(List<Vector> lists, File file) {
try {
Vector content;
FileWriter fileWritter = new FileWriter(file);
BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
for (int i = 0; i < lists.size(); i++) {
content = lists.get(i);
for (int j = 0; j < lists.get(i).size(); j++) {
String str = "";
str += content.get(j) + ",";
bufferWritter.write(str);
}
bufferWritter.newLine();
}
bufferWritter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Frame_Main(null);
}
}