Java事件处理延迟 [英] Java event handling with a delay
问题描述
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链接
The above code is used to create a chart and I have to develop something like amcharts link
我尝试使用计时器,但事件没有延迟,不管我使用的延迟。任何人都可以帮助我在得到延迟?这与Jcharts没有任何关系。这纯粹是事件处理。
I tried using Timer but the events are not getting delayed irrespective of the delay I use.Can anyone help me in getting the delay? This has nothing to with Jcharts though.This is purely event handling.
推荐答案
你正在做你的计时器侦听器应该是在Rotator的构造函数中执行。这样你就可以立即执行动作而没有延迟。你也没有任何正在听定时器事件的东西。
you are doing the logic that your timer listener should be performing in the constructor of your Rotator. this way you immediately perform the action without the delay. you also dont have anything that is listening for timer events.
而应该让你的PieChartDemo实现 ActionListener
和有你的定时器处理:
instead, you should have your PieChartDemo implement ActionListener
and have it do your timer processing:
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传递给构造函数:
you will also need to pass in your ActionListener to the constructor:
old:
Rotator(final PiePlot plot) {
super(100,null); // this passes a null listener to the timer object
new:
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 is a good tutorial on swing timers
这篇关于Java事件处理延迟的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!