【问题标题】:paint() in java applet is called twice for no reasonjava小程序中的paint()无故被调用两次
【发布时间】:2011-12-25 10:53:32
【问题描述】:

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 会执行两次。(例如 if[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);????

【问题讨论】:

    标签: java applet paint paintcomponent


    【解决方案1】:

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

    您应该定义一个添加到JAppletJPanel。你画到JPanel

    其次,你应该使用paintComponent()方法,并调用超类行为,像这样。

    protected void paintComponent(Graphics g) {
        // Paint the default look.
        super.paintComponent(g);
    
        // Your custom painting here.
        g.drawImage(foregroundImage, x, y, this);
    }
    

    第三,您无法控制 Swing 何时触发 paintComponent() 方法。您应该使用其他方法进行计算,并将paintComponent()中的代码限制为实际绘图方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      相关资源
      最近更新 更多