Java 如何在JFreechart graph上绘制多个图形

Java 如何在JFreechart graph上绘制多个图形,java,swing,jfreechart,arduino-uno,Java,Swing,Jfreechart,Arduino Uno,我在一个arduino项目中工作,我应该使用串行读取来绘制图形。我正在使用JFreechart。在我的代码中,我只能绘制一个图形。但是我需要在同一个图形上绘制4个或多个图 我得到一些用“,”分隔的数值。下面是代码。请帮助我绘制4个或多个图形。我可以画一个,但不能超过一个 import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.Acti

我在一个arduino项目中工作,我应该使用串行读取来绘制图形。我正在使用JFreechart。在我的代码中,我只能绘制一个图形。但是我需要在同一个图形上绘制4个或多个图

我得到一些用“,”分隔的数值。下面是代码。请帮助我绘制4个或多个图形。我可以画一个,但不能超过一个

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import com.fazecast.jSerialComm.SerialPort;

public class SerialDataRead {

static SerialPort chosenPort;

public static void main(String[] args) {
    // TODO Auto-generated method stub
    final JFrame window = new JFrame();
    window.setTitle("Sensor graph GUI");
    window.setSize(1200,800);
    window.setLayout(new BorderLayout());
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel basePanel = new JPanel();
    basePanel.setSize(900, 700);

    final JComboBox portList = new JComboBox();
    final JButton connectButton = new JButton("Connect");
    JPanel topPanel = new JPanel();
    window.add(topPanel, BorderLayout.NORTH);
    topPanel.add(portList);
    topPanel.add(connectButton);


    SerialPort[] portNames = SerialPort.getCommPorts();
    for(int i =0; i < portNames.length; i++)
        portList.addItem(portNames[i].getSystemPortName());



    final XYSeries series = new XYSeries("Serial port data reading");
    final XYSeries series2 = new XYSeries("Serial port data reading");
    XYSeriesCollection dataset = new XYSeriesCollection(series);
    JFreeChart chart = ChartFactory.createXYLineChart("Serial port reading", "Time (seconds)", "adc reading", dataset);
    XYPlot plot = (XYPlot) chart.getPlot();
    plot.setBackgroundPaint(Color.WHITE);
    NumberAxis domain = (NumberAxis) plot.getDomainAxis();
    NumberAxis rangeAxis   = (NumberAxis) plot.getRangeAxis();
    //domain.setRange(0.00, 40.00);
     rangeAxis.setRange(0.0, 505.0);
    window.add(new ChartPanel(chart), BorderLayout.CENTER);


    connectButton.addActionListener(new ActionListener(){

         public void actionPerformed(ActionEvent arg0){
            if(connectButton.getText().equals("Connect")){

                chosenPort =  SerialPort.getCommPort(portList.getSelectedItem().toString());
                chosenPort.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 0, 0);
                if(chosenPort.openPort()){
                    connectButton.setText("Disconnect");
                    portList.setEnabled(false);

                }

                Thread thread = new Thread(){
                    @Override public void run(){
                        Scanner scanner = new Scanner(chosenPort.getInputStream());
                    int x =0;
                        while(scanner.hasNextLine()){

                            String line = scanner.nextLine();
                            String[] values = line.split(",");
                            int number = Integer.parseInt(values[0]);
                            int number2 = Integer.parseInt(values[1]);
                            series.add(x++, number);
                            //series2.add(x++, number2);
                               XYSeriesCollection my_data_series= new XYSeriesCollection();
                                // add series using addSeries method
                                my_data_series.addSeries(series);
                              //  my_data_series.addSeries(series2);
                               // JFreeChart XYLineChart=ChartFactory.createXYLineChart("Team - Number of Wins","Year","Win Count",my_data_series,PlotOrientation.VERTICAL,true,true,false);
                            //window.repaint();
                            System.out.println(Integer.parseInt(values[1]));
                        }
                        scanner.close();
                    }
                };

                thread.start();


            }else{

                chosenPort.closePort();
                portList.setEnabled(true);
                connectButton.setText("Connect");
            }

        }
    });

    window.setVisible(true);
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Scanner;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.axis.NumberAxis;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.chart.plot.XYPlot;
导入org.jfree.data.xy.XYSeries;
导入org.jfree.data.xy.XYSeriesCollection;
导入com.fazecast.jSerialComm.SerialPort;
公共类SerialDataRead{
静态串行端口选择端口;
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
最终JFrame窗口=新JFrame();
setTitle(“传感器图形GUI”);
窗口设置大小(1200800);
setLayout(新的BorderLayout());
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel basePanel=新的JPanel();
基板。设置尺寸(900700);
最终JComboBox端口列表=新JComboBox();
最终JButton connectButton=新JButton(“连接”);
JPanel-topPanel=新的JPanel();
添加(topPanel,BorderLayout.NORTH);
topPanel.add(端口列表);
topPanel.add(连接按钮);
SerialPort[]端口名=SerialPort.getCommPorts();
for(int i=0;i

}

您的程序不正确地同步,因为它从非线程更新Swing GUI组件。使用(如图所示)收集
doInBackground()
publish()
临时结果实现中的数据,并更新
process()
实现中的每个系列,该系列将在事件分派线程上调用。您可以向组成
XYSeriesCollection
的单个
XYSeriesCollection
添加()
值,如图所示。

您的程序同步错误,因为它从除。使用(如图所示)收集
doInBackground()
publish()
临时结果实现中的数据,并更新
process()
实现中的每个系列,该系列将在事件分派线程上调用。您可以向组成
XYSeriesCollection
的单个
XYSeries
添加()值,如图所示