2016-07-21 5 views
3

Ich bin Rendering-Problem konfrontiert, wenn ich alle 500 Millisekunden paintComponent() aufrufen, um aktualisierte Diagramme anzuzeigen. Ich habe ungefähr 30 Barcharts erstellt mit JFreeChart auf Panel.Rendering Swing-Komponente reibungslos alle 500 Millisekunden

Rendering with error and Wie kann ich dieses Problem lösen?

private void ShowGraphs() { 

    FirstChart.removeAll(); 
    SecondChart.removeAll(); 
    ThirdChart.removeAll(); 
    FirstChart.add(Label1); 
    SecondChart.add(Label2); 
    ThirdChart.add(Label3); 

    ChartUpdate(P1,FirstChart); 
    ChartUpdate(P2,SecondChart); 
    ChartUpdate(P3,ThirdChart); 
    //FirstChart, SecondChart, ThirdChart is JPanels 
    //Tabb is JTabbedPane 
    paintComponents(Tabb.getGraphics()); 
} 

Dieser Code alle 500 Millisekunden aufgerufen und ChartUpdate(MyObject, Panel) ist Funktionsplan Gebäude auf PanelMyObject ‚s Info verwenden.

+0

was meinst du mit flackernden? – Javant

+0

Das JTabbedPane (doubleBuffered) wird mit PaintComponent() neu gezeichnet, was zu Flackern führt (das habe ich kürzlich herausgefunden). Auch wenn es neu streicht. Es wird mit Fehler neu gezeichnet. Wie kann ich ohne Fehler neu streichen? –

+1

Eine relevante Frage: Wie können wir helfen, Probleme zu identifizieren, die zu Ihrem Problem ohne relevanten Code beitragen? Bitte erstellen und veröffentlichen Sie Ihre [mcve] oder [sscce] (http://sscce.org). –

Antwort

4

Nicht ersetzen die View-Komponente. Aktualisieren Sie stattdessen das entsprechende Modell und die Überwachungsansicht aktualisiert sich daraufhin selbst. Im folgenden Beispiel hat jeder ChartPanel, der von createPane() zurückgegeben wird, einen Swing Timer, der seine XYSeries alle 500 ms aktualisiert.

image

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 

/** 
* @see http://stackoverflow.com/a/38512314/230513 
* @see http://stackoverflow.com/a/15715096/230513 
* @see http://stackoverflow.com/a/11949899/230513 
*/ 
public class Test { 

    private static final int N = 128; 
    private static final Random random = new Random(); 
    private int n = 1; 

    private void display() { 
     JFrame f = new JFrame("TabChart"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel p = new JPanel(new GridLayout(0, 1)); 
     for (int i = 0; i < 3; i++) { 
      p.add(createPane()); 
     } 
     f.add(p, BorderLayout.CENTER); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private ChartPanel createPane() { 
     final XYSeries series = new XYSeries("Data"); 
     for (int i = 0; i < random.nextInt(N) + N/2; i++) { 
      series.add(i, random.nextGaussian()); 
     } 
     XYSeriesCollection dataset = new XYSeriesCollection(series); 
     new Timer(500, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       series.add(series.getItemCount(), random.nextGaussian()); 
      } 
     }).start(); 
     JFreeChart chart = ChartFactory.createXYLineChart("Test", "Domain", 
      "Range", dataset, PlotOrientation.VERTICAL, false, false, false); 
     return new ChartPanel(chart) { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(480, 240); 
      } 
     }; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test().display(); 
      } 
     }); 
    } 
} 
+1

Vielen Dank für die brillanten Antworten. Ich habe alle Änderungen. Liebe euch alle. –

Verwandte Themen