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 link的东西
我尝试使用计时器,但事件没有得到延迟,无论我use.Can的延迟,谁能帮我得到延迟?这与Jcharts无关,though.This是纯粹的事件处理。
发布于 2009-07-10 17:51:21
您正在执行计时器侦听器应该在旋转器的构造函数中执行的逻辑。通过这种方式,您可以立即执行操作,而不会延迟。你也没有任何监听计时器事件的东西。
相反,您应该让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是一个关于swing计时器的很好的教程
发布于 2009-07-10 17:48:49
鼠标事件处理程序永远不会释放CPU。旋转器不会导致线程休眠,因此鼠标事件一处理,整个延迟就会发生。
https://stackoverflow.com/questions/1110913
复制相似问题