2009-07-10 106 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++; 
     } 




    } 
} 

}Java事件与延迟

上面的代码被用于创建图表和我有开发类似amcharts link

我使用定时器试过,但都没有得到延误的事件,不论处理我使用的延迟时间。任何人都可以帮助我获得延迟?这与Jcharts无关。这纯粹是事件处理。

+0

如果你可以组织发布的代码,使用代码环境,这将是很好的能够在问题编辑器。 – freitass 2009-07-10 17:35:51

+0

第二@freitass,它也相当长,目标是一个SCCEE(http://sscce.org/)。一个简单的例子显示了你使用Timer的尝试,以及它如何不符合你的期望,将是理想的。 – 2009-07-10 17:38:55

+0

对不起,我实际上在做 – Harish 2009-07-10 17:40:38

回答

1

你正在做你的计时器监听器应该在你的Rotator的构造函数中执行的逻辑。这样你就可以毫不拖延地立即执行操作。你也没有任何东西在听定时器事件。

相反,你应该有你的PieChartDemo实施ActionListener,并让它做你的定时器处理:

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. 

here是振荡定时器一个很好的教程

+0

我没有得到你想说的话?你能清楚吗? – Harish 2009-07-10 17:53:51

1

您的鼠标事件处理程序永远不会释放CPU。旋转器不会导致线程进入休眠状态,因此只要处理鼠标事件就会发生整个延迟。

+0

那么如何释放CPU。Timer类中没有睡眠方法 – Harish 2009-07-10 17:49:59

+0

Thread.currentThread()。wait(1); //使用等待只是放弃CPU – 2009-07-10 18:05:53

+0

另一种解决方案:Thread.sleep(1); – 2009-07-10 18:16:00