Panel中更新图片的问题
我重载了JPanel类,重写了paintComponent方法在其中显示一张图片。
第一次显示图片没有问题。
但是当改变了图片的内容后,界面上无法更新,显示的还是第一次的图片。
请问这是什么原因?
谢谢。
问题点数:100、回复次数:11Top
1 楼milkbottle(奶瓶->好好学习,天天向上)回复于 2006-02-11 23:52:53 得分 20
JPanel.repaint(); 有没有调用?Top
2 楼aaa2003gf(珍惜 (MSN:aaa2003gf@hotmail.com))回复于 2006-02-12 00:05:56 得分 20
你在换图片后updateUI() 一下试试Top
3 楼BeShrek(今晚打老虎)回复于 2006-02-12 00:14:22 得分 0
调repaint()了Top
4 楼BeShrek(今晚打老虎)回复于 2006-02-12 00:25:33 得分 0
Class ChartPanel extends JPanel {
....
....
public void paintComponent(Graphics g) {
System.out.println("### paint start");
super.paintComponent(g);
g.drawImage(chartImage, 0, 0, this);
System.out.println("### paint end");
}
....
....
}
这是重写的JPanel的paintComponent()方法。
图片更新后,这个方法确实被自动调用了,但是界面上没有反应。 -________-bTop
5 楼milkbottle(奶瓶->好好学习,天天向上)回复于 2006-02-12 00:31:03 得分 30
this.invalidate();
this.validate();
一下试试Top
6 楼BeShrek(今晚打老虎)回复于 2006-02-12 00:42:40 得分 0
还是无效。
public class FluxPanel extends JPanel {
FluxChart fluxChart = null;
static double[][] data;
String chartFileName = "c:\\chart.jpg";
private int width = 400;
private int height = 200;
Image chartImage = null;
public FluxPanel(double[][] XYData) {
this.data = XYData;
setOpaque(true);
refresh();
}
public FluxPanel() {
setOpaque(true);
refresh();
}
public void refresh(){
//生成流量图
fluxChart = new FluxChart(data, width, height, chartFileName);
try {
fluxChart.saveChart();
} catch (Exception e) {
System.out.println("生成图表失败");
}
chartImage = null;
chartImage = Toolkit.getDefaultToolkit().getImage(chartFileName);
}
public void paintComponent(Graphics g) {
System.out.println("### paint start");
super.paintComponent(g);
g.drawImage(chartImage, 0, 0, this);
System.out.println("### paint end");
}
public void setXYData(double[][] XYData){
this.data = XYData;
}
}
上面是该类的全部代码。
更新图片后调用:
panel.setXYData(myData);
panel.refresh();
panel.repaint();
this.repaint(); //Frame的repaint()
跟踪代码后发现,图片确实变了,paintComponent()也确实被调用了,
但就是界面上没有反应。Top
7 楼BeShrek(今晚打老虎)回复于 2006-02-12 00:44:25 得分 0
上面有一句说错了,是调用refresh()方法更新图片。Top
8 楼mixianger(米香儿)回复于 2006-02-13 13:47:55 得分 30
建议这么写:
panel.removeAll();
panel.repaint();
panel.validate();
我这么做是好用的。你试试。
Top
9 楼BeShrek(今晚打老虎)回复于 2006-02-15 20:39:57 得分 0
好的,我回去试试
两天之内结贴Top
10 楼BeShrek(今晚打老虎)回复于 2006-02-16 09:36:13 得分 0
上面的方法还是不行,removeAll()方法无效~Top
11 楼BeShrek(今晚打老虎)回复于 2006-02-17 20:36:06 得分 0
还是没解决,结贴了,谢谢各位Top




