Bonjour et merci pour ta réponse,
J'ai tenté d'utiliser un SwingWorker. Mais les courbes ne s'affichent toujours pas.
Un peu de précision sur ma structure de classe :
- une classe MainView possède une liste de ViewCurve de courbe.
La méthode draw ci dessus appartient à cette classe MainView.
Elle est lancée par la méthode "paintComponent(Graphics g)" du JComponent qui contient le ploter (contenant le MainView).
C'est pour cela que je lance les viewCurve.draw(...) dans un thread pour les détacher de l'EDT.
- la classe ViewCurve dispose d'un renderer pour afficher la courbe sur l'écran. La methode ViewCurve.draw(...) est définit ci-dessous.
Elle lance simplement la méthode draw() du renderer
1 2 3 4 5 6 7 8
|
/* (non-Javadoc)
* @see com.math.xyploter.data.view.ICurveView#draw(java.awt.Graphics2D, java.awt.geom.Rectangle2D, com.math.xyploter.axis.Axis, com.math.xyploter.axis.Axis, com.math.number.ValueReader)
*/
@Override
public void draw(Graphics2D g2, Rectangle2D parentBounds, Axis xAxis, Axis yAxis, ValueReader reader) {
this.getRenderer().draw(g2, parentBounds, xAxis, yAxis, reader);
} |
Voici ce qui j'ai fait avec le SwingWorker:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
public class XYLineRendererWorker extends SwingWorker<Boolean, XYLine> {
public XYLineRenderer renderer;
public Graphics2D g2;
public Rectangle2D parentBounds;
public Axis xAxis;
public Axis yAxis;
public ValueReader reader;
public XYLineRendererWorked(XYLineRenderer renderer, Graphics2D g2, Rectangle2D parentBounds, Axis xAxis, Axis yAxis, ValueReader reader) {
this.renderer = renderer;
this.g2 = g2;
this.parentBounds = parentBounds;
this.xAxis = xAxis;
this.yAxis = yAxis;
this.reader = reader;
}
/* (non-Javadoc)
* @see javax.swing.SwingWorker#doInBackground()
*/
@Override
protected Boolean doInBackground() throws Exception {
//construction des points de la courbe "affichable"...
return true;
}
@Override
protected void process(List<XYLine> lines) {
for (XYLine l: lines)
g2.drawLine(l.x1, l.y1, l.x2, l.y2);
}
} |
Pour faire simple la méthode "doInBackground()" est un copié collé de la methode viewCurve.draw(...) dans lequel les
g2.drawLine(x1, y1, x2, y2);
ont été remplacés par :
publish(new XYLine(x1, y1, x2, y2));
La méthode CurveRenderer.draw(...) est définie ci-dessous.
Elle construit et lance le worker.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
/*
* (non-Javadoc)
* @see math.xyploter.data.renderer.CurveRenderer#draw(java.awt.Graphics2D, java.awt.geom.Rectangle2D, math.xyploter.axis.Axis, math.xyploter.axis.Axis, math.number.ValueReader)
*/
@Override
public void draw(Graphics2D g2, Rectangle2D parentBounds, Axis xAxis, Axis yAxis, ValueReader reader) {
if ((parentBounds.getHeight()<20) || parentBounds.getHeight()<20)
return;
initPaint(g2);
XYLineRendererWorker worker = new XYLineRendererWorker(this, g2, parentBounds, xAxis, yAxis, reader);
worker.execute();
} |
Il me semble que le détachement de EDT est réalisé par le thread dans le draw(...) de la MainView.
Et que la synchro avec l'EDT est réalisée avec le worker.
Avec vous une idée sur ce qui cloche?
Partager