2009-07-10 10 views
1
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartMouseEvent; 
import org.jfree.chart.ChartMouseListener; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.entity.ChartEntity; 
import org.jfree.chart.plot.PiePlot; 
import org.jfree.chart.plot.PiePlot3D; 
import org.jfree.data.general.DefaultPieDataset; 
import org.jfree.data.general.PieDataset; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 

/** 
* A simple demonstration application showing how to create a pie chart using 
* data from a {@link DefaultPieDataset}. 
*/ 
public class PieChartDemo1 extends ApplicationFrame implements ChartMouseListener { 
private JFreeChart chart; 
private PiePlot plot; 
private int angle=270; 
private static double explodePercent = 0.99; 
private static long count=0; 
/** 
* Default constructor. 
* 
* @param title the frame title. 
*/ 
public PieChartDemo1(String title) { 
    super(title); 
      this.chart = ChartFactory.createPieChart(
      "Pie Chart Demo 1", // chart title 
      createDataset(),    // data 
      true,    // include legend 
      true, 
      false 
     ); 

     this.plot = (PiePlot) chart.getPlot(); 
     this.plot.setSectionOutlinesVisible(false); 
     this.plot.setNoDataMessage("No data available"); 
     this.plot.setBackgroundAlpha(0.2f); 
     this.plot.setBackgroundPaint(Color.WHITE); 
     this.plot.setExplodePercent("One",.99); 
     this.angle=270; 
     ChartPanel chartpanel = new ChartPanel(chart, false, false, false, false,  false); 
     chartpanel.setVisible(true); 
    chartpanel.addChartMouseListener(this); 
    chartpanel.setPreferredSize(new Dimension(500, 270)); 
    setContentPane(chartpanel); 
} 

/** 
* Creates a sample dataset. 
* 
* @return A sample dataset. 
*/ 
private static PieDataset createDataset() { 
    DefaultPieDataset dataset = new DefaultPieDataset(); 
    dataset.setValue("One", new Double(43.2)); 
    dataset.setValue("Two", new Double(10.0)); 
    dataset.setValue("Three", new Double(27.5)); 
    dataset.setValue("Four", new Double(17.5)); 
    dataset.setValue("Five", new Double(11.0)); 
    dataset.setValue("Six", new Double(19.4)); 
    return dataset; 
} 

/** 
* Creates a chart. 
* 
* @param dataset the dataset. 
* 
* @return A chart. 
*/ 
private static JFreeChart createChart(PieDataset dataset) { 

    JFreeChart chart = ChartFactory.createPieChart3D(
     "Pie Chart Demo 1", // chart title 
     dataset,    // data 
     true,    // include legend 
     true, 
     false 
    ); 

    PiePlot plot = (PiePlot) chart.getPlot(); 
    plot.setSectionOutlinesVisible(false); 
    plot.setNoDataMessage("No data available"); 
    plot.setBackgroundAlpha(0.2f); 
    return chart; 

} 

/** 
* Creates a panel for the demo (used by SuperDemo.java). 
* 
* @return A panel. 
*/ 
public static JPanel createDemoPanel() { 
    JFreeChart chart = createChart(createDataset()); 
    ChartPanel chartpanel = new ChartPanel(chart, false, false, false, false, false); 
    chartpanel.setVisible(true);  
    chartpanel.setPreferredSize(new Dimension(500, 270)); 
    return new JPanel(); 
} 

/** 
* Starting point for the demonstration application. 
* 
* @param args ignored. 
*/ 
public static void main(String[] args) { 


    PieChartDemo1 demo = new PieChartDemo1("Pie Chart Demo 1"); 
    demo.pack(); 
    RefineryUtilities.centerFrameOnScreen(demo); 
    demo.setVisible(true); 
} 

public void chartMouseClicked(ChartMouseEvent chartmouseevent) 
{ 
ChartEntity chartentity = chartmouseevent.getEntity(); 
if (chartentity != null){ 
    this.plot.setStartAngle(angle); 
    this.angle=angle+5; 
    this.plot.setStartAngle(angle); 
    this.plot.setExplodePercent("One", .8); 
    System.out.println("Mouse clicked: " + chartentity.toString()); 
} 
else 
System.out.println("Mouse clicked: null entity."); 
} 

public void chartMouseMoved(ChartMouseEvent chartmouseevent) 
{ 
int i = chartmouseevent.getTrigger().getX(); 
int j = chartmouseevent.getTrigger().getY(); 
ChartEntity chartentity = chartmouseevent.getEntity(); 
if (chartentity != null) 
{ 
    //this.plot.setStartAngle(angle); 
//this.angle=angle-5; 
//this.plot.setStartAngle(angle); 
    System.out.println("Explode Percent is "+plot.getExplodePercent("One"));   
    Rotator rotator=new Rotator(plot); 
    rotator.setInitialDelay(10000000); 
    rotator.setDelay(100000000); 

    rotator.start(); 
    //System.out.println("Mouse moved: " + i + ", " + j + ": " + chartentity.toString()); 
} 
//else 
//System.out.println("Mouse moved: " + i + ", " + j + ": null entity."); 
} 

static class Rotator extends Timer { 

    /** The plot. */ 
    private PiePlot plot; 

    /** The angle. */ 

    private int X,Y; 

    /** 
    * Constructor. 
    * 
    * @param plot the plot. 
    */ 
    Rotator(final PiePlot plot) { 
     super(100,null);    
     this.plot = plot;    

     while(count<999999999&&explodePercent>=0){ 
     if(explodePercent>0)  
     explodePercent=explodePercent-.0001; 
     else 
     explodePercent=explodePercent+.0001; 
     plot.setExplodePercent("One", explodePercent); 
     count++; 
     } 




    } 
} 

}événement Java manipulation avec un retard

Le code ci-dessus est utilisé pour créer un graphique et je dois développer quelque chose comme amcharts link

J'ai essayé d'utiliser la minuterie, mais les événements ne sont pas obtenir un retard, quel que soit du retard que j'utilise. Est-ce que quelqu'un peut m'aider à obtenir le délai? Cela n'a rien à voir avec les jcharts. Il s'agit d'une manipulation purement événementielle.

+0

Ce serait bien si vous pouviez organiser le code affiché, utilisez l'environnement de code disponible capable à l'éditeur de questions. – freitass

+0

Deuxième @freitass, c'est aussi plutôt long, viser un SCCEE (http://sscce.org/). Un bref exemple qui montre ce que vous avez essayé avec Timer et comment il n'a pas répondu à vos attentes serait idéal. –

+0

Désolé, je faisais ça – Harish

Répondre

1

vous faites la logique que votre auditeur minuterie devrait effectuer dans le constructeur de votre Rotator. De cette façon, vous effectuez immédiatement l'action sans délai. vous n'avez également rien qui écoute les événements de minuterie.

à la place, vous devriez avoir votre PieChartDemo mettre en œuvre ActionListener et lui faire effectuer le traitement de votre minuterie:

public void actionPerformed(ActionEvent actionevent) { 
    //you can test if the event has come in from the timer 
    if (actionevent.getSource() == myTimer) { 
    while(count<999999999&&explodePercent>=0){ 
     if(explodePercent>0)  
     explodePercent=explodePercent-.0001; 
     else 
     explodePercent=explodePercent+.0001; 
     getPlot().setExplodePercent("One", explodePercent); 
    count++; 
    } 
    } 
} 

ou quelque chose comme ça.

vous aurez également besoin de passer dans votre ActionListener au constructeur:

ancienne:

Rotator(final PiePlot plot) { 
    super(100,null); // this passes a null listener to the timer object 

nouvelle:

Rotator(final PiePlot plot, ActionListener listener) { 
    super(100, listener); // this will pass in the listener, which will then get timer updates, delayed as you have specified. 

here est un bon tutoriel sur minuteries swing

+0

Je n'ai pas compris ce que vous voulez dire? Pouvez-vous être clair? – Harish

1

Votre gestionnaire d'événements de la souris ne libère jamais la CPU. Le Rotator n'entraîne pas le thread à dormir, donc le délai entier se produit dès que l'événement de la souris est géré.

+0

Donc, comment libérer le CPU.Il n'y a pas de méthode de veille dans la classe Timer – Harish

+0

Thread.currentThread(). Wait (1); // en utilisant wait juste pour abandonner le CPU –

+0

Une autre solution: Thread.sleep (1); –