java applet中的paint()无故被调用两次

时间:2011-11-09 16:05:22

标签: java applet paint paintcomponent

有没有一个共同的原因可以在不打算的情况下调用paint()方法两次。我有以下代码:

public void paint(Graphics g)
{
     //Graphics2D gg;
     //gg=(Graphics2D) g;

     drawMatrix(g);

}

        private void drawMatrix(Graphics g) {

       int side = 40;
       hex hexagon=new hex();
       for(int i = 0; i<9; i++) 
          for(int k = 0; k<9; k++){ 

            g.setColor(Color.lightGray);
            g.fill3DRect(i*side,k*side, side, side, true);
            if (matrix[i][k]!=null){System.out.println("i is "+i+" k is "+k);
                g.setColor(Color.black);hexagon.DrawHexfromMatrix(g, i, k, Color.black);}
    }   
    }

hex是一个扩展多边形的类(用于模拟六边形图形),而DrawHexfromMatrix是一个从绘制的矩阵的索引中绘制六边形的函数(将六边形放在矩阵的槽中)。如果您认为它有帮助,我可以提供整个代码,但是现在我不明白为什么system.out.println被执行两次。(例如,如果[1] [2]和[2] [3]不是null它将打印:

    i is 1 k is 2 
    i is 2 k is 3 
    i is 1 k is 2
    i is 2 k is 3  

我认为这也会影响我的绘图,因为有时虽然[i] [k]中存在一个元素但是没有绘制。(矩阵是十六进制的矩阵)。

稍后编辑:是否有可能以某种方式g.fill3DRect(i * side,k * side,side,side,true);重写我试图用hexagon绘制的六边形.DrawHexfromMatrix(g,i,k,Color.black); ???

1 个答案:

答案 0 :(得分:4)

首先,你不应该直接画到JApplet

您应该定义添加到JPanel的{​​{1}}。你画到JApplet

其次,您应该使用JPanel方法,并调用超类行为,如下所示。

paintComponent()

第三,你无法控制Swing何时触发protected void paintComponent(Graphics g) { // Paint the default look. super.paintComponent(g); // Your custom painting here. g.drawImage(foregroundImage, x, y, this); } 方法。您应该使用其他方法进行计算,并将paintComponent()中的代码限制为实际绘图方法。