如何使用新的散点更新绘图区域?

时间:2016-03-24 14:33:57

标签: java swing jframe jpanel scatter-plot

我写了一个连接到GPS接收器并从中拉出坐标的程序。我想创建一个散点图,我将在其上绘制从接收器拉出的位置点,每次有新的观测值时都应该更新该图。 她是我的串口读取器类,它允许我从接收器中提取数据:

class SerialPortReader implements SerialPortEventListener {
    public void serialEvent(SerialPortEvent event) {
        if (event.isRXCHAR() && event.getEventValue() > 0) {         
            try {
                String tmp = SP.readString();
                String[] msgs = tmp.split("\r\n");
                for (int j = 0; j < msgs.length; j++){
                    if (msgs[j].contains("$GPGGA") && msgs[j].length() > 60){
                        System.out.println(msgs[j]);
                        NMEA nmea = new NMEA();
                        nmea.parse(msgs[j]);
                        System.out.println(nmea.position.toString());
                        writer.write(nmea.position.toString() + "\n");
                    }
                }
            } 
            catch (SerialPortException ex) {System.out.println(ex);} 
            catch (IOException ex) {System.out.println(ex);}
        }
    }
}

这是我的端口连接器方法:

public void openport(){
    try {   
        SP.openPort();
        SP.setParams(SerialPort.BAUDRATE_115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        SP.addEventListener(new SerialPortReader(),SerialPort.MASK_RXCHAR);

        String dir = System.getProperty("user.dir");
        String file = dir+"\\NMEAout\\nmeaClean.txt";
        writer = new BufferedWriter(new FileWriter(file));

        Canvas C = new Canvas();
        C.setBackground(Color.green);
        frame = new JFrame("canvas");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setLocation(500, 500);
        frame.setSize(1000, 1000);
        frame.add(C);
    } 
    catch (SerialPortException ex) {System.out.println(ex);} 
    catch (IOException ex) {System.out.println(ex);}
}

这是我的Canvas类,它应该允许我在屏幕上绘制点。它没有完成,这是我需要帮助的部分:

class Canvas extends JPanel{
    int x = 100, y = 100;
    public void newParam (int xnew, int ynew){
        x = xnew;
        y = ynew;
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillOval(x, y, 5, 5);
        repaint();
    }
}

frame是在我的主类顶部声明的JFrame对象。 问题是我不明白如何通过事件监听器获取Canvas后得到新点。我还想绘制新点而不删除旧点。

任何人都可以帮忙吗?任何帮助,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

  

问题是我不明白如何通过事件监听器获取Canvas后得到新点

您需要在自定义绘画类中使用API​​,以便添加要绘制的新点。

有两种常用的渐进式绘画方法:

  1. 保留一个要绘制的点列表,然后每次遍历列表并绘制点

  2. 将每个点绘制到BufferedImage上,然后绘制BufferedImage。

  3. 查看Custom Painting Approaches了解这两种方法的工作示例。试着两个,看看你更喜欢哪个。