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);
     }
 }