Graphics.drawimage 无效
Graphics.drawimage doesn't work
下面的代码应该显示一个红色的矩形,但实际上并没有用。但是,如果我取消注释 paint
方法,它会起作用;似乎 main
方法中的 g.drawImage(app.img, 0, 0, f)
不起作用。有什么问题和解决方案?
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
public class LoadImageApp extends Component {
private static final int SCREEN_WIDTH = 400;
private static final int SCREEN_HEIGHT = 300;
BufferedImage img;
// public void paint(Graphics g) {
// g.drawImage(img, 0, 0, null);
// }
public LoadImageApp() {
img = new BufferedImage(SCREEN_WIDTH,
SCREEN_HEIGHT, BufferedImage.TYPE_3BYTE_BGR);
byte[] b = ((DataBufferByte) img.getRaster().getDataBuffer())
.getData();
for (int i = 0; i < img.getWidth() * img.getHeight(); i++) {
b[i * 3] = 0;
b[i * 3 + 1] = 0;
b[i * 3 + 2] = (byte)0xff;
}
}
public Dimension getPreferredSize() {
if (img == null) {
return new Dimension(100, 100);
} else {
return new Dimension(img.getWidth(null), img.getHeight(null));
}
}
public static void main(String[] args) {
JFrame f = new JFrame("Load Image Sample");
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
LoadImageApp app = new LoadImageApp();
f.add(app);
f.pack();
f.setVisible(true);
Graphics g = app.getGraphics();
g.drawImage(app.img, 0, 0, f);
}
}
您的代码正在运行,但它可能看起来没有任何反应,因为 g.drawImage(app.img, 0, 0, f);
仅在您的主方法启动时被调用一次,并且图像在 window 更新后立即再次隐藏。
要解决此问题,您需要向组件添加图像以使其自动 updates/paints,或者像您提到的那样覆盖 public void paint(Graphics g)
方法。
编辑:
如果您坚持使用绘画覆盖,请不要在您的组件绘画方法上伪造调用 super,否则将不会绘制任何子组件或其他绘画相关项目。
public void paint(Graphics g) {
super.paintComponents(g);
g.drawImage(img, 0, 0, null);
}
如果图像是背景,您可以在 g.drawimage
之后放置 super.paintComponents
下面的代码应该显示一个红色的矩形,但实际上并没有用。但是,如果我取消注释 paint
方法,它会起作用;似乎 main
方法中的 g.drawImage(app.img, 0, 0, f)
不起作用。有什么问题和解决方案?
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
public class LoadImageApp extends Component {
private static final int SCREEN_WIDTH = 400;
private static final int SCREEN_HEIGHT = 300;
BufferedImage img;
// public void paint(Graphics g) {
// g.drawImage(img, 0, 0, null);
// }
public LoadImageApp() {
img = new BufferedImage(SCREEN_WIDTH,
SCREEN_HEIGHT, BufferedImage.TYPE_3BYTE_BGR);
byte[] b = ((DataBufferByte) img.getRaster().getDataBuffer())
.getData();
for (int i = 0; i < img.getWidth() * img.getHeight(); i++) {
b[i * 3] = 0;
b[i * 3 + 1] = 0;
b[i * 3 + 2] = (byte)0xff;
}
}
public Dimension getPreferredSize() {
if (img == null) {
return new Dimension(100, 100);
} else {
return new Dimension(img.getWidth(null), img.getHeight(null));
}
}
public static void main(String[] args) {
JFrame f = new JFrame("Load Image Sample");
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
LoadImageApp app = new LoadImageApp();
f.add(app);
f.pack();
f.setVisible(true);
Graphics g = app.getGraphics();
g.drawImage(app.img, 0, 0, f);
}
}
您的代码正在运行,但它可能看起来没有任何反应,因为 g.drawImage(app.img, 0, 0, f);
仅在您的主方法启动时被调用一次,并且图像在 window 更新后立即再次隐藏。
要解决此问题,您需要向组件添加图像以使其自动 updates/paints,或者像您提到的那样覆盖 public void paint(Graphics g)
方法。
编辑: 如果您坚持使用绘画覆盖,请不要在您的组件绘画方法上伪造调用 super,否则将不会绘制任何子组件或其他绘画相关项目。
public void paint(Graphics g) {
super.paintComponents(g);
g.drawImage(img, 0, 0, null);
}
如果图像是背景,您可以在 g.drawimage
super.paintComponents