高分求证,这个问题是不是java.awt的bug.
我因为某些特殊的原因,必须把自己的控件从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);
}
}