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++;
        }




    }
}

}

上面的代码用于创建图表,我必须开发类似amcharts 链接

我尝试使用 Timer,但无论我使用什么延迟,事件都没有延迟。谁能帮我解决延迟?不过,这与 Jcharts 无关。这纯粹是事件处理。

4

2 回答 2

1

您的鼠标事件处理程序永远不会释放 CPU。Rotator 不会导致线程休眠,因此一旦处理鼠标事件,整个延迟就会发生。

于 2009-07-10T17:48:48.597 回答
1

您正在执行计时器侦听器应在 Rotator 的构造函数中执行的逻辑。这样您就可以立即执行操作而不会延迟。您也没有任何正在监听计时器事件的东西。

相反,您应该实现 PieChartDemoActionListener并让它进行计时器处理:

 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++;
    }
   }
 }

或类似的东西。

您还需要将 ActionListener 传递给构造函数:

老的:

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

新的:

 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.   

是一个关于摇摆计时器的好教程

于 2009-07-10T17:51:21.430 回答