Java事件处理延迟 [英] Java event handling with a delay

查看:216
本文介绍了Java事件处理延迟的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆