2016-03-24 3 views
0

Я написал программу, которая подключается к приемнику 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

проблема заключается в том, что я не понимаю, как получить Canvas построить новые точки после того, как я их получить через слушателя событий

Вам нужен API в пользовательском классе живописи, что позволяет добавлять новые очки для окрашивания.

Есть то два общих подход для инкрементальной живописи:

  1. Держите список точек рисовать, а затем перебирать в список каждый раз и рисует точку

  2. рисовать каждую точку на BufferedImage, а затем просто нарисуйте BufferedImage.

Отъезд Custom Painting Approaches для рабочих примеров обоих этих подходов. Попробуйте оба, чтобы увидеть, что вы предпочитаете лучше.

+0

Вы имеете в виду, что мне нужен метод, который сохранит новое местоположение в x и y? этот метод следует вызывать из метода последовательных событий? –

+0

@ DanyLavrov, нет, это НЕ то, что я имею в виду. Каждый раз, когда вы рисуете компонент, старая картина стирается и выполняется новая картина. Таким образом, с вашим кодом у вас будет только один овал, даже если вы измените значения x/y. Вы попробовали демонстрационный код из предоставленной ссылки. Он содержит рабочие примеры, похожие на то, что вы хотите. Код позволяет добавлять дополнительные прямоугольники для рисования. Вы хотите Овал. Код уже имеет метод 'addRectangle (...)'. Не должно быть так трудно перейти от прямоугольника к овалу. – camickr

+0

Да. Уже работает. Спасибо. –

Смежные вопросы