所以我有一个扩展JApplet的类Board,在它的构造函数中,我创建了一个JPanel,后来我开始绘制框,但是当我尝试使用getGraphics时它返回null:/
JPanel panel;
public Board(int x, int y, int wolfNumber, int hareNumber){
this.x=x;
this.y=y;
wolvesCoords = new int[wolfNumber][2];
haresCoords = new int[hareNumber][2];
panel = new JPanel();
panel.setVisible(true);
add(panel);
}
public synchronized void write(int xx, int yy, Color c){
int width=panel.getWidth()/x;
int height=panel.getHeight()/y;
Graphics g = panel.getGraphics();
System.out.println(g);
g.setColor(c);
g.drawRect(xx*width, yy*height, width, height);
g.fillRect(xx*width, yy*height, width, height);
}
public void paint(Graphics g)
{
super.paint(g);
}
它在g.setColor(c)行给出nullpointerexception,因为g为null。
答案 0 :(得分:3)
您的常见问题和问题是您不应该使用通过在组件上调用getGraphics()
获得的Graphics对象的另一个原因。你不应该这样做的另一个原因是,如果你成功获得一个非null的Graphics对象(只有 组件已经渲染后),它将不会持久存在,并且你的图像如果发生任何重绘,则可以变为空。
而是执行教程建议您做的事情:使用JPanel的paintComponent方法中提供给您的Graphics对象进行绘制。如果要绘制固定背景,则在BufferedImage中执行此操作,然后在paintComponent方法中绘制BufferedImage。
修改强>
你问:
为什么我会在paint方法中调用绘图代码?我只需要在调用方法write时绘制,而不是在应用程序启动时绘制。
因为这就是Swing图形的完成方式,因为按照自己的方式进行操作会遇到很多问题(您已经遇到过这种情况)。再一次,不要猜测这些东西 - 阅读教程,它们都为你解释得很好。
修改强>
您在评论中说明:
实际上当我尝试添加覆盖时会出现此错误 - 方法不会覆盖或实现超类型的方法。可能是我正在扩展JApplet吗?
是的,完全如此。
我必须
是的,您必须有一个扩展JApplet的类才能生成JApplet,但您不必并且实际上不应该直接在其中绘制。而是创建一个扩展JPanel的单独类,并在该类的paintComponent
方法中创建图形。然后在applet中显示JPanel。
答案 1 :(得分:3)
您使用的Graphics
对象错误。而不是在您调用它的任何地方调用write
,而是覆盖paintComponent
。你可以这样做:
private int xx;
private int yy;
private Color c;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(c != null) {
int width=panel.getWidth()/x;
int height=panel.getHeight()/y;
g.setColor(c);
g.drawRect(xx*width, yy*height, width, height);
g.fillRect(xx*width, yy*height, width, height);
}
}
public void write(int xx, int yy, Color c) {
this.xx = xx;
this.yy = yy;
this.c = c;
repaint();
}