2012-12-12 1 views
1

J'ai des difficultés à dessiner une image sur un JFreeChart - XYLineChart. Le principal problème est que les coordonnées x et y de l'annotation sont mises à jour dynamiquement en temps réel. Donc, avec mon code, ajouter l'annotation et l'effacer pour que la nouvelle soit dessinée provoque un scintillement gênant pour l'utilisateur.Scintillement XYImageAnnotation sur JFreeChart avec temporisateur

J'ai vérifié quelques exemples de problèmes de scintillement sur JAVA en utilisant les méthodes update(), paint() ou repaint() en utilisant des graphiques, mais ne semble pas implémentable sur un JFreeChart.

Avez-vous des idées pour vous débarrasser du scintillement ou d'une solution de contournement pour utiliser une image bufferedImage sur JFreeChart au lieu d'une annotation?

Pour être ici plus spécifique est la ligne tracée et l'image:

Screenshot

Alors cette croix (comme l'image en mémoire tampon) doit aller sur la ligne de tracé de haut en bas avec les valeurs mises à jour de axe x et y.Mais ce mouvement provoque le scintillement malheureusement.

Voici la partie de mon code où je dessine l'image - Je ne peux pas donner SSCCE je suppose car il y a plus de 15 classes et 5 km de code écrit:

// After a button clicked on panel 
SomeButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 

     // The chart and XYPlot is already drawn at this point 


     // Reading the image 
     try { 
      myPicture = ImageIO 
        .read(new File("\\\\Users2\\blabla\\Data\\MyPictures\\x.png")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     // Setting up a timer 
     timer2 = new java.util.Timer(); 

     Object source = event.getSource(); 
     if (source == SomeButton) { 

     // Setting up a task 
      task2 = new java.util.TimerTask() { 
       @Override 
       public void run() { 
        double x1; 
        double y1; 
        try { 
         // Getting different x and y values from a microcontroller instantaneously 
         if (microContConnected()) { 

          x1 = microCont.getX(); 
          y1 = microCont.getY(); 

          // creating the annotation 
          XYImageAnnotation ImageAnn = new XYImageAnnotation(x1, y1, myPicture); 

          // Here is the drawing and clearing made ! 
          plot.addAnnotation(ImageAnn);  
          pause(50); 
          plot.clearAnnotations();  
         } 

        } catch (SerialPortException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      }; 
      timer2.scheduleAtFixedRate(task2, 50, 50); 
     } 
    } 
}); 
+0

Impossible de reproduire. Un [sscce] (http://sscce.org/) devrait être <100 lignes de code. Utilisez une icône 'Shape' ou une icône' UIManager' existante pour votre image et une 'javax.swing.Timer' pour une synchronisation plus facile. – trashgod

Répondre

0

Il semble que je trouve moi-même solution ; au lieu d'ajouter l'image à l'intrigue, j'utilise le moteur de rendu et il n'y a pas de fonction de pause entre l'ajout et le retrait de l'image avec de nouvelles coordonnées. La séquence d'ajout et de suppression est également inversée. Surprenant pour moi de travailler de cette façon, je dois dire. Il n'y a pas de scintillement à gauche; il est aussi lisse qu'un graphique écrêté ou double tamponné. :) Voici le nouveau code:

// renderer 
    final XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer(); 

    // Reading the image 
    try { 
     myPicture = ImageIO.read(new File("\\\\Users2\\blabla\\Data\\MyPictures\\x.png")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    // Setting up a timer 
    timer2 = new java.util.Timer(); 

    Object source = event.getSource(); 
    if (source == someButton) { 

       task2 = new java.util.TimerTask() { 
        @Override 
        public void run() { 
         if (check == true) { 
          if (microContConnected()) { 

           x1 = microCont.getX(); 
           y1 = microCont.getY(); 

           renderer.removeAnnotations(); 

           XYImageAnnotation img2 = new XYImageAnnotation(
             x1, y1, myPicture); 
           renderer.addAnnotation(img2, 
             Layer.FOREGROUND); 
          } 
         } 
        } 
       }; 
       timer2.scheduleAtFixedRate(task2, 50, 50); 
      }