我有一个自定义 JPanel,有时在我的程序中,我需要调用一个将屏幕绘制为黑色的方法,就是这样。
public void clearScreen() {
Graphics g = getGraphics();
g.setColor(Color.black);
g.fillRect(0,0,getWidth(),getHeight());
}
当我启动程序时,我调用这个方法。
然而,我发现有时有效,有时无效。这很奇怪。我还发现,当它不起作用时,图形对象不为空,并且宽度和高度也被正确定义(来自 getWidth() 和 getHeight())。
为什么这有时有效有时无效?
在程序中的某个时刻在 JPanel 上进行自定义绘图的正确方法是什么?像我一样使用 getGraphics() 是否正确?我的 JPanel(在某些时候)有 JComponent,但后来我删除了这些 JComponent 并进行了一些自定义图形绘制。为什么这有时会起作用?
不要通过在 JPanel 等组件上调用 getGraphics 来获取 Graphics 对象,因为获得的 Graphics 对象不会在下次重新绘制时保留(这可能是问题的根源)。
相反,请考虑在 BufferedImage 中进行所有绘图,并且then您可以随心所欲地使用 getGraphics() 。如果您这样做,请不要忘记在完成绘画后处理 Graphics 对象。
e.g.,
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class MyPaint extends JPanel {
public static final int IMG_WIDTH = 400;
public static final int IMG_HEIGHT = IMG_WIDTH;
private BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT,
BufferedImage.TYPE_INT_ARGB);
public MyPaint() {
MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
addMouseListener(myMouseAdapter);
addMouseMotionListener(myMouseAdapter);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, 0, 0, null);
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(IMG_WIDTH, IMG_HEIGHT);
}
public void clearScreen() {
Graphics g = image.getGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, image.getWidth(), image.getHeight());
g.dispose();
repaint();
}
private class MyMouseAdapter extends MouseAdapter {
// code to draw on the buffered image.
// Don't forget to call repaint() on the "this" JPanel
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)