我在实现jfreechart的例子时遇到一些问题,我把jfreechart的例子改造成了applet形式,现在我想让我的applet在打开后能自动改变图表,就在init()或start()中加入了一个timer,如下
timer.schedule(new RemindTask(), 
                0,        //initial delay 
                3000);  //subsequent rateRemindTask定义如下:    class RemindTask extends TimerTask { 
        int numWarningBeeps = 3; 
        public void run() {
            if (numWarningBeeps > 0) { 
                ..........设一些初始化值............             getContentPane().add(createPanel());
                repaint();//此处是我自己想的,不知道对不对
                setVisible(true);
            numWarningBeeps--; 
            } else { 
                //timer.cancel();
                System.exit(0);
            } 
        } 
    }     可是执行后效果完全不是我想象的,设置初始化值与createPanel函数我跟踪都执行正确,但是在html上执行applet时,只显示第一个图表,然后就不刷新新的图表了
    请教各位达人是那里出的问题,个人感觉是在刷新上的问题,repaint()是我自己蒙着用的,是不是根本不对呀

解决方案 »

  1.   

    ..........设一些初始化值............// 加上这句试试。
    getContentPane().setLayout(new FlowLayout());getContentPane().add(createPanel());
      

  2.   

    to UnAgain:
    加上了你说的代码,现在我在eclipse的小程序查看器里预览,在窗囗大小不改变时,还是只显示打开时的图表,可是如果我最大化窗囗,发现在第一个图表下面显示出了timer生成的第二张图表(因大小关系显示不全),有什么办法不改变窗囗大小就能直接让第二个图表覆盖第一个图表
      

  3.   

    刚刚加了getContentPane().removeAll();

    getContentPane().add(createPanel());
    前面结果在小程序查看器里,打开后applet不刷新,但改变查看器的大小后就刷出新的图表了,但在html里还不行,改变大小或最小化再打开后applet变灰什么也不显示了...:(
      

  4.   

    我的目的就是用html打开applet,打开后显示出来默认图表,此时applet的timer事件去读取指定件,获得参数后要改变图表显示,这都是基于jfreechart做的
    代码如下:applet的
    package applet;import javax.swing.*;
    import javax.swing.JApplet;
    import java.awt.*;import org.jfree.data.general.DefaultValueDataset;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.ChartPanel;
    import org.jfree.data.Range;
    import org.jfree.chart.plot.DialShape;
    import org.jfree.chart.plot.MeterPlot;
    import org.jfree.chart.plot.MeterInterval;
    import java.awt.BasicStroke;
    import java.awt.Dimension;
    import java.awt.Font;
    import org.jfree.data.general.ValueDataset;
    import java.awt.Color;
    import java.util.List;
    import java.util.StringTokenizer;
    import java.util.Iterator;
    import java.awt.Paint;import java.util.Timer;
    import java.util.TimerTask;public class MeterChartApplet extends JApplet {
    private final Timer timer = new Timer();

        private static DefaultValueDataset dataset;    private Range range;
        private Iterator intervals;    private double rangelower;
        private double rangeupper;
        private double value;        //Initialize the applet
        public void init() {
            try {
              setRange();
              setIntervals();
              setValue();
              value = 24.2D;
              setIntervals2("Normal,0.0D,35D,lightGray,2.0F,0,255,0,64|Warning,35D,50D,lightGray,2.0F,255,255,0,64|Critical,50D,60D,lightGray,2.0F,255,0,0,128");
              this.resize(400,300);
              JPanel jpanel = createPanel();
              this.getContentPane().add(jpanel);
    } catch (Exception e) {
                e.printStackTrace();
            }
        }    public void start() {
    // Put your code here
            timer.schedule(new RemindTask(), 
                    2000,        //initial delay 
                    3000);  //subsequent rate
        }
        
        //计时器
        class RemindTask extends TimerTask { 
            int numWarningBeeps = 3; 
            double tmp = 33.2D;
            public void run() {
                if (numWarningBeeps > 0) { 
                    setRange();
                    setIntervals();
                    value = tmp;
                    tmp = tmp + 3D;
                 //JOptionPane.showMessageDialog(null, "1", "", JOptionPane.INFORMATION_MESSAGE);
                    getContentPane().removeAll();
                 JPanel jpanel = createPanel();
                 getContentPane().add(jpanel);
                    //setContentPane(jpanel);
                 //JOptionPane.showMessageDialog(null, "2", "", JOptionPane.INFORMATION_MESSAGE);
                 //Graphics g = getGraphics();
                    //update(g);
                    repaint();
                    setVisible(true);
                    numWarningBeeps--; 
                } else { 
                 repaint();
                    //timer.cancel(); //Not necessary because we call System.exit 
                    //System.exit(0);   //Stops the AWT thread (and everything else) 
                } 
            } 
        }     
        private void setRange(){
            double lower = Double.parseDouble(StringUtil.null2String(getParameter("Range.LowerBound"),"0.0D"));
            double upper = Double.parseDouble(StringUtil.null2String(getParameter("Range.UpperBound"),"60D"));
            range = new Range(lower,upper);
        }    private void setIntervals() {
            String meterintervals = getParameter("Intervals");
            if (meterintervals==null)return;
            List intervalslist = new java.util.ArrayList();
            StringTokenizer st = new StringTokenizer(meterintervals,"|");
            StringTokenizer mtst;
            while (st.hasMoreTokens()) {
                mtst = new StringTokenizer(st.nextToken(),",");
                intervalslist.add(new MeterInterval(mtst.nextToken(),
                                                     new Range(Double.parseDouble(mtst.nextToken()), Double.parseDouble(mtst.nextToken())),
                                                     ColorUtil.getColor(mtst.nextToken()),
                                                     new BasicStroke(Float.parseFloat(mtst.nextToken())),
                                                     new Color(Integer.parseInt(mtst.nextToken()), Integer.parseInt(mtst.nextToken()), Integer.parseInt(mtst.nextToken()), Integer.parseInt(mtst.nextToken()))
                                                           ));
            }
            intervals = intervalslist.iterator();
        }    private void setValue(){
            value = Double.parseDouble(StringUtil.null2String(getParameter("Value"),"0.0D"));
        }
        
        //Construct the applet
        public MeterChartApplet() {
        }
        private MeterPlot createMeterPlot(ValueDataset valuedataset) {
            MeterPlot meterplot = new MeterPlot(valuedataset);
            meterplot.setRange(range);
            if(intervals!=null){
                while(intervals.hasNext())
                    meterplot.addInterval((MeterInterval)intervals.next());
            }
            clean();
            return meterplot;
        }
        private JFreeChart createChart(ValueDataset valuedataset) {
            JFreeChart jfreechart = new JFreeChart("Meter Chart 1",
                                                   JFreeChart.DEFAULT_TITLE_FONT,
                                                   createMeterPlot(valuedataset), true);
            return jfreechart;
        }
        public ChartPanel createPanel() {
            dataset = new DefaultValueDataset(value);
            JFreeChart jfreechart = createChart(dataset);
            ChartPanel chartpanel = new ChartPanel(jfreechart);
            return chartpanel;
        }}
    调用的html的
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK">
    <title> 
    HTML Test Page
    </title>
    </head>
    <body>
    <br>
    <applet
      codebase ="."
      code     = "com.thtf.bi.dashboard.applet.MeterChartApplet.class"
      name     = "TestApplet"
      width    = "400"
      height   = "300"
      hspace   = "0"
      vspace   = "0"
      align    = "middle"

    <param name="Range.LowerBound" value="0.0D" />
    <param name="Range.UpperBound" value="60D" />
    <param name="Intervals" value="Normal,0.0D,35D,lightGray,2.0F,0,255,0,64|Warning,35D,50D,lightGray,2.0F,255,255,0,64|Critical,50D,60D,lightGray,2.0F,255,0,0,128" />
    <param name="Value" value="25.5D" />
    </applet>
    </body>
    </html>
      

  5.   

    就你现在的代码,把repaint改为validate()
      

  6.   

    to UnAgain:
    改过了,好使了,非常感谢!最后再问一个问题,validate()与repaint()有什么区别,都是什么用途?非常感谢!
      

  7.   


    容器中的部件改变之后,需要使用validate()重新布置。
    repaint会触发本部件的paint方法。开始我用JFrame作容器,按照你的代码更新,并没有问题,可能是AWT和Swing在处理上有差别。