我在实现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()是我自己蒙着用的,是不是根本不对呀
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()是我自己蒙着用的,是不是根本不对呀
getContentPane().setLayout(new FlowLayout());getContentPane().add(createPanel());
加上了你说的代码,现在我在eclipse的小程序查看器里预览,在窗囗大小不改变时,还是只显示打开时的图表,可是如果我最大化窗囗,发现在第一个图表下面显示出了timer生成的第二张图表(因大小关系显示不全),有什么办法不改变窗囗大小就能直接让第二个图表覆盖第一个图表
在
getContentPane().add(createPanel());
前面结果在小程序查看器里,打开后applet不刷新,但改变查看器的大小后就刷出新的图表了,但在html里还不行,改变大小或最小化再打开后applet变灰什么也不显示了...:(
代码如下: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>
改过了,好使了,非常感谢!最后再问一个问题,validate()与repaint()有什么区别,都是什么用途?非常感谢!
容器中的部件改变之后,需要使用validate()重新布置。
repaint会触发本部件的paint方法。开始我用JFrame作容器,按照你的代码更新,并没有问题,可能是AWT和Swing在处理上有差别。