Java Swing JTable 简易版CSV阅读工具

背景描述:

        csv只能用excel打开,然后excel对源csv数据默认进行了格式化,导致源数据格式发生了变化。然而用记事本打开csv,数据对齐错乱不便于观察和查找数据,花费1小时怒写简易版CSV查看工具。


展示效果: 

废话不多说,先上效果图






完整代码实现:

import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import java.util.List;

public class table extends JTable{
    private DefaultTableModel model;
    //窗口宽高
    static int width=1900;
    static int height=1000;
    private static table table =null;
    // 表头(列名)
    private static String[] columnNames = null;
    //Top Panel
    private static JPanel panel=new JPanel(new BorderLayout());
    //条件选择 checkBoxes
    private static List<JCheckBox> checkBoxes=new ArrayList<>();
    //文件选择、搜索相关按钮
    private static JButton fileSelBtn=new JButton("选择");
    private static JTextField textField=new JTextField();
    private static JCheckBox isAllSelCheckBox=new JCheckBox("全选");
    private static JButton searchBut=new JButton("搜索");
    private static JButton nextBtn=new JButton("下一个");
    //匹配到多少个
    private static JLabel label=new JLabel("");
    //文件路径
    private static JTextField filePathText=new JTextField();
    //放入搜索匹配的行数
    private static List<Integer> rowNumb=null;
    //当前选中的行在rowNumb中的索引,默认index=0
    private static int rowNumbIndex=0;


    public static void main(String[] args) throws IOException {

        JFrame f = new JFrame();
        f.setTitle("CSV简易阅读工具");
        f.getContentPane().setLayout(new BorderLayout());

        //Top
        panel.setPreferredSize(new Dimension(width,250));
        f.getContentPane().add(panel,BorderLayout.NORTH);

        /**
         * 加载选择csv
         */
        loadSelCsv(f);

        f.setSize(width, height);
        f.setVisible(true);
    }

    /**
     * 构造表格
     * @param header
     */
    public table(String[] header) {
        model = new DefaultTableModel(header, 0);
        this.setModel(model);
    }


    /**
     * 插入一行数据
     * @param data
     */
    public void InsertValue(List<String> data) {
        Thread thread = new Thread() {
            public void run() {
                Vector<String> value = null;
                for(int i=0;i<data.size();i++){
                    value = new Vector<String>();
                    String[] da=data.get(i).split(",");
                    for (String str:da){
                        value.add(str);
                    }
                    addRow(value);
                    try {
                        sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        };
        thread.start();
    }

    /**
     * 将添加记录
     *
     * @param value
     */
    public void addRow(final Vector value) {
        Thread thread = new Thread() {
            public void run() {
                Runnable runnable = new Runnable() {
                    public void run() {
                        model.addRow(value);
                    }
                };
                SwingUtilities.invokeLater(runnable);
            }
        };
        thread.start();
    }

    /**
     * 读取csv数据
     * @param path
     * @return
     * @throws IOException
     */
    public static Map<String, List<String>> readCSV(String path) throws IOException {
        String line = "";
        Map<String,List<String>> map=new HashMap<String, List<String>>();
        //读取文件
        InputStreamReader isr= new InputStreamReader(new FileInputStream(path),"GBK");
        BufferedReader br = new BufferedReader(isr);
        List<String> title= Collections.synchronizedList(new ArrayList<String>());
        //放入csv数据
        List<String> data=Collections.synchronizedList(new ArrayList<String>());
        int i=0;
        while ((line = br.readLine()) != null) {
            //去掉引号
            line=line.replace("\"","");
            if(i==0) {
                title.add(line);
            }else {
                data.add(line);
            }
            i++;
        }
        map.put("title",title);
        map.put("data",data);
        br.close();
        isr.close();
        return map;
    }


    /**
     * 加载各个组件
     * @param f
     */
    public static void load(JFrame f,String path) throws IOException {
        Map<String, List<String>> csv= readCSV(path);
        List<String> title=csv.get("title");
        List<String> data=csv.get("data");
        // 表头(列名)
        columnNames = title.get(0).split(",");

        /**
         * 加载条件
         */
        loadCheckBoxes();

        /**
         * 加载搜索面板
         */
        loadSearchPanel(data);

        /**
         * 加载表格
         * @param f
         */
        loadTable(f,data);

        /**
         * 刷新页面
         */
        f.revalidate();

    }


    /**
     * 加载csv文件
     */
    public static void loadSelCsv(JFrame f){
        JPanel csvPanel=new JPanel(new FlowLayout(FlowLayout.LEFT));
        csvPanel.setPreferredSize(new Dimension(width,50));
        JLabel filePath=new JLabel("文件路径:");
        csvPanel.add(filePath);
        filePathText.setPreferredSize(new Dimension(350,28));
        csvPanel.add(filePathText);
        csvPanel.add(fileSelBtn);
        panel.add(csvPanel,BorderLayout.NORTH);

        //监听文件选择
        fileSelBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser jfc=new JFileChooser();
                jfc.setFileFilter(new FileFilter() {
                    @Override
                    public String getDescription() {
                        return "CSV文件(*.csv)";
                    }
                    @Override
                    public boolean accept(File f) {
                        if(f.isDirectory()){
                            return true;
                        }
                        if(f.getName().toLowerCase().endsWith(".csv")) {
                            return true;
                        }
                        return false;
                    }
                });
                //显示对话框
                int ret=jfc.showSaveDialog(f.getContentPane());
                //获取选择的文件路径
                if(ret==JFileChooser.APPROVE_OPTION){
                    File file=jfc.getSelectedFile();
                    filePathText.setText(file.getAbsolutePath());
                    try {
                        load(f,file.getAbsolutePath());
                    } catch (IOException ioException) {
                        ioException.printStackTrace();
                    }
                }
            }
        });
    }

    /**
     * 加载条件选择
     */
    public static void loadCheckBoxes(){
        //条件选择
        JPanel selPanel=new JPanel(new FlowLayout(FlowLayout.LEFT));
        selPanel.setPreferredSize(new Dimension(width,150));
        panel.add(selPanel,BorderLayout.CENTER);
        for(String t:columnNames){
            JCheckBox checkBox = new JCheckBox(t);
            checkBoxes.add(checkBox);
            selPanel.add(checkBox);
        }
    }

    /**
     * 加载搜索面板
     */
    public static  void loadSearchPanel(List<String> data){
        JPanel searchPanel=new JPanel(new FlowLayout(FlowLayout.RIGHT));
        searchPanel.setPreferredSize(new Dimension(width,50));
        panel.add(searchPanel,BorderLayout.SOUTH);

        searchPanel.add(label);
        searchPanel.add(isAllSelCheckBox);

        textField.setPreferredSize(new Dimension(150,28));
        searchPanel.add(textField);

        searchPanel.add(searchBut);

        searchPanel.add(nextBtn);

        //监听搜索按钮
        searchBut.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //先移除所有选择的行
                table.clearSelection();
                String text=textField.getText();
                //搜索字段
                Map<String,String> map=new HashMap<>();
                for (JCheckBox checkBox:checkBoxes){
                    map.put(checkBox.getText(),checkBox.isSelected()==true?"true":"false");
                }

                //放入搜索匹配的行数
                rowNumb=new ArrayList<>();

                int rowIndex=0;
                for (String rowData:data){
                    String[] rowD=rowData.split(",");
                    //默认搜索到
                    boolean isSearch=true;
                    for (int c=0;c<columnNames.length;c++){
                        String name=columnNames[c];
                        if(c>=rowD.length){
                            isSearch=false;
                            continue;
                        }
                        String value=rowD[c];
                        String isSearchField=map.get(name);
                        if("true".equals(isSearchField)){
                            if(!value.contains(text)){
                                isSearch=false;
                            }
                        }
                    }
                    if(isSearch){
                        rowNumb.add(rowIndex);
                    }
                    rowIndex++;
                }
                //查询到n个
                label.setText("查询到"+rowNumb.size()+"个");

                //选中查询到的行,并设置其背景颜色
                for (Integer ind:rowNumb){
                    //防止添加行出错
                    if(ind>=table.getRowCount()){
                        continue;
                    }
                    table.addRowSelectionInterval(ind,ind);
                }
                table.setSelectionBackground(Color.orange);//选中行设置背景色
                //跳转到第一个查询到的
                table.scrollRectToVisible(table.getCellRect(rowNumb.get(0), 0, true));
                rowNumbIndex=0;
            }
        });

        //监听下一个
        nextBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(rowNumb==null){
                    return;
                }
                rowNumbIndex=rowNumbIndex+1;
                if (rowNumbIndex>=rowNumb.size()){
                    rowNumbIndex=0;
                }
                //跳转到下一行
                table.scrollRectToVisible(table.getCellRect(rowNumb.get(rowNumbIndex), 0, true));
            }
        });

        //监听全选按钮
        isAllSelCheckBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(isAllSelCheckBox.isSelected()){
                    for (JCheckBox checkBox:checkBoxes){
                        checkBox.setSelected(true);
                    }
                }else {
                    for (JCheckBox checkBox:checkBoxes){
                        checkBox.setSelected(false);
                    }
                }
            }
        });


    }

    /**
     * 加载表格
     * @param f
     * @param data
     */
    public static void loadTable(JFrame f,List<String> data){
        table = new table(columnNames);
        //选中行设置背景色
        table.setSelectionBackground(Color.orange);
        //设置JTable的列宽随着列表内容的大小进行调整
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        for (int i = 0; i < columnNames.length; i++) {
            table.getColumnModel().getColumn(i).setPreferredWidth(200);
        }
        //加载数据
        table.InsertValue(data);
        JScrollPane scroll = new JScrollPane(table);
        f.getContentPane().add(scroll, BorderLayout.CENTER);
    }
}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值