高分求证,这个问题是不是java.awt的bug.

ThisFellow 2002-05-21 11:58:24
我因为某些特殊的原因,必须把自己的控件从java.awt.Canvas上继承,
我发现在特定情况之下,在Canvas上drawImage有问题。
为了把任意大小的image描画到整个Canvas上,我调用drawImage(image, 0, 0, size.width, size.height, 0, 0, imgSize.width,
imgSize.height, this);
如果,image的size与Canvas的size不一样,当我改变整个JavaApplication的窗口,
使滚动条出现,并且向右或向下拖动滚动条,然后点击图片,这时我调用了Canvas的repaint(),问题出现了,整个图像向下移动了,但是,请注意,我用drawRect画的矩形的位置没有变,是对的。
我把Source贴在下面,运行方法是java TestDrawImgOnCanvas jpegFilePath
jpeg文件用C:\WINNT\Web\Wallpaper\Windows 2000.jpg就可以。

/*
* put your module comment here
* formatted with JxBeauty (c) johann.langhofer@nextra.at
*/
import java.net.URL;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;


/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/
public class TestDrawImgOnCanvas extends Frame {
TestCanvas testCanvas;

public TestDrawImgOnCanvas (URL jpgURL) {
init(jpgURL);
}

public void init (URL jpgURL) {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
setSize(600, 600);
ScrollPane p = new ScrollPane();
p.setSize(600, 600);
this.add(p);
testCanvas = new TestCanvas();
testCanvas.setSize(600, 600);
testCanvas.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked (MouseEvent e) {
testCanvas.repaint();
}
});
try {
testCanvas.setResource(jpgURL);
p.add(testCanvas);
} catch (Exception e) {
e.printStackTrace();
};

}
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
public static void main (String[] args) throws Exception{
String jpgPath = "C:\\temp\\test.jpg";
if(args.length>0){
jpgPath =args[0];
}
URL jpgURL = new File(jpgPath).toURL();
Frame app = new TestDrawImgOnCanvas(jpgURL);
app.setEnabled(true);
app.show();
}
}


class TestCanvas extends java.awt.Canvas {
BufferedImage image = null;

public void setResource (URL url) throws java.io.IOException {
BufferedInputStream jpgStream = new BufferedInputStream(url.openStream());
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(jpgStream);
image = decoder.decodeAsBufferedImage();
jpgStream.close();
}

public void paint (Graphics g) {
if (image != null) {
Dimension size = getSize();
Dimension imgSize = new Dimension(image.getWidth(this), image.getHeight(this));
g.drawImage(image, 0, 0, size.width, size.height, 0, 0, imgSize.width,
imgSize.height, this);
g.drawRect(0, 0, 20, 20);
g.drawRect(100, 100, 20, 20);
}
}

public void update(Graphics g) {
paint(g);
}
}




...全文
27 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
nil2000 2002-05-21
  • 打赏
  • 举报
回复
完全照做,还是没有变化
ThisFellow 2002-05-21
  • 打赏
  • 举报
回复
改变整个JavaApplication的窗口,
使滚动条出现,并且向右或向下拖动滚动条,然后点击图片.
nil2000你是不是按上面步骤做了?
nil2000 2002-05-21
  • 打赏
  • 举报
回复
我看不出图像下移
ThisFellow 2002-05-21
  • 打赏
  • 举报
回复
我测过的JDK环境:
JDK1.4 OK
JDK1.3 NG

如果有谁在JDK1.4以下环境能够不移动,请报上你的环境。
谢谢
qiaojiannan 2002-05-21
  • 打赏
  • 举报
回复
我这里没动!
================================================================

CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!

★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。

★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。

Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]

Freda 2002-05-21
  • 打赏
  • 举报
回复
你不妨使用Swing组件中的JPanel,它和awt中的Canvas有同样的功能。Swing组件比awt好。
g_yxh 2002-05-21
  • 打赏
  • 举报
回复
我这也下移了,的确很奇怪耶
ThisFellow 2002-05-21
  • 打赏
  • 举报
回复
最新测试结果:
JDK1.4 OK
JDK1.3 NG

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧