将数据从串口插入JTable

时间:2017-09-28 01:07:54

标签: java swing arduino serial-port jtable

我需要从arduino读取数据并将其发送到表格。 我尝试了我在互联网上找到的所有解决方案,但我的程序仍然没有显示表格。我认为问题在于metod getColumnCount(),但我无法解决它。我是编程的新手,我可能犯了一些愚蠢的错误,所以我很抱歉打扰,但我不能单独处理它。

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;

public class SerialTest extends JPanel implements SerialPortEventListener {

/**
 * 
 */
private static final long serialVersionUID = 1L;
SerialPort serialPort;
public static  ArrayList<String> header;
public static   ArrayList<ArrayList<String>> dataList;

private static final String PORT_NAMES[]={"/dev/tty.usbserial-A9007UX1",  "/dev/ttyACM0", "/dev/ttyUSB0", "COM8"};
private BufferedReader input;
private OutputStream output;
private static final int TIME_OUT=200;
private static final int DATA_RATE=9600;

public void initialize(){
    System.setProperty("gnu.io.rxtx.SerialPorts", "/dev/ttyACM0");

    CommPortIdentifier portId=null;
    Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

    while(portEnum.hasMoreElements()){
        CommPortIdentifier currPortId=(CommPortIdentifier)portEnum.nextElement();
        for(String portName : PORT_NAMES){
            if(currPortId.getName().equals(portName)){
                portId=currPortId;
                break;
            }
        }
    }
    if(portId==null){
        System.out.println("Could non find COM port");
        return;
    }

    try {
        serialPort=(SerialPort)portId.open(this.getClass().getName(),TIME_OUT);
        serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        input=new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
        output=serialPort.getOutputStream();

        serialPort.addEventListener(this);
        serialPort.notifyOnDataAvailable(true);
        serialPort.disableReceiveTimeout();
        serialPort.enableReceiveThreshold(1);

    } catch (Exception e) {
        // TODO Auto-generated catch block
        System.err.println(e.toString());
    }   
}

public synchronized void close(){
    if(serialPort != null){
        serialPort.removeEventListener();
        serialPort.close();
    }
}

@Override
public void serialEvent(SerialPortEvent oEvent) {
    if(oEvent.getEventType()==SerialPortEvent.DATA_AVAILABLE){
        try{
            dataList=new ArrayList<ArrayList<String>>();
            String inputLine=input.readLine();
            String[] rows=inputLine.split(",");
            for(String row: rows){
                row=row.trim();
                ArrayList<String> lista=new ArrayList<String>();
                lista.addAll(Arrays.asList(row.split("\n")));
                dataList.add(lista);
                header=new ArrayList<String>();
                header.add("PWM");
                header.add("Uin");
                header.add("Uout"); 
            }

        }catch(Exception e){
            System.err.println(e.toString());
        }
    }

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

    JFrame frame=new JFrame("Table");
    SerialTest main=new SerialTest();           
    JTable table=new JTable(main.new MyTableModel());
    table.setPreferredScrollableViewportSize(new Dimension(500,70));
    table.setFillsViewportHeight(true);
    JScrollPane scrollPane=new JScrollPane();
    frame.add(scrollPane);
    frame.setSize(300, 200);
    frame.pack();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    main.initialize();
    Thread t=new Thread(){
        public void run(){
            try{Thread.sleep(100000);}catch(InterruptedException ie){}

        }
    };
t.start();
}


class MyTableModel extends AbstractTableModel{

/**
 * 
 */
private static final long serialVersionUID = 1L;
//ArrayList<String> header;
//ArrayList<ArrayList<String>> dataList;



@Override
public int getRowCount() {
// TODO Auto-generated method stub
return dataList.size();
}

@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return header.size();
}

@Override
public Object getValueAt(int row, int column) {

return ((ArrayList<String>) dataList.get(row)).get(column);
}
}
}

我有错误

Exception in thread "main" java.lang.NullPointerException
at SerialTest$MyTableModel.getColumnCount(SerialTest.java:157)
at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1285)
at javax.swing.JTable.tableChanged(JTable.java:4386)
at javax.swing.JTable.setModel(JTable.java:3688)
at javax.swing.JTable.<init>(JTable.java:632)
at javax.swing.JTable.<init>(JTable.java:573)
at SerialTest.main(SerialTest.java:116)

0 个答案:

没有答案