Cod*_*Guy 5 java graphics swing jpanel jframe
我有一个自定义JPanel,有时在我的程序中,我需要调用一个方法,将屏幕画成黑色,就是这样.
public void clearScreen() {
Graphics g = getGraphics();
g.setColor(Color.black);
g.fillRect(0,0,getWidth(),getHeight());
}
Run Code Online (Sandbox Code Playgroud)
当我启动程序时,我称之为此方法.
但是,我发现它有时会起作用,有时则不然.这很奇怪.我还发现,当它不起作用时,图形对象不为null,宽度和高度也正确定义(来自getWidth()和getHeight()).
为什么这有时会起作用,有时候不起作用?
在程序的某个时刻在我的JPanel上制作自定义绘图的正确方法是什么?我正在使用getGraphics()是否正确?我的JPanel(在某些时候)有JComponents,但后来我删除了那些JComponents并做了一些自定义图形绘制.为什么这有时只会起作用?
Hov*_*els 14
不要通过在JPanel等组件上调用getGraphics来获取Graphics对象,因为获得的Graphics对象不会在下一次重绘时保留(这可能是您的问题的根源).
相反,考虑在BufferedImage中完成所有绘图,然后就可以使用getGraphics()来实现内容.如果这样做,请不要忘记在完成绘图时丢弃Graphics对象.
例如,
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7536 次 |
| 最近记录: |