我写了一个连接到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后得到新点。我还想绘制新点而不删除旧点。
任何人都可以帮忙吗?任何帮助,将不胜感激。谢谢。
答案 0 :(得分:1)
问题是我不明白如何通过事件监听器获取Canvas后得到新点
您需要在自定义绘画类中使用API,以便添加要绘制的新点。
有两种常用的渐进式绘画方法:
保留一个要绘制的点列表,然后每次遍历列表并绘制点
将每个点绘制到BufferedImage上,然后绘制BufferedImage。
查看Custom Painting Approaches了解这两种方法的工作示例。试着两个,看看你更喜欢哪个。