在添加JComponent时,java graphics中的paint函数是否多次调用?

在添加JComponent时,java graphics中的paint函数是否多次调用?,java,swing,Java,Swing,我正在做一个国际象棋游戏,其中每个棋盘(类)都有一个X和Y位置,棋盘由一个二维的棋盘阵列表示。我有一个名为board的类,它扩展了JComponent,我的主函数将board添加到JFrame中。根据我读到的内容,paint函数被隐式调用(不确定)。问题是,当我尝试打印瓷砖的x和y位置(被迭代)时,它会打印所有的x和y位置三次,这让我相信绘画被调用了不止一次 董事会级别: class Board extends JComponent{ Tile[][] board1; Board

我正在做一个国际象棋游戏,其中每个棋盘(类)都有一个X和Y位置,棋盘由一个二维的棋盘阵列表示。我有一个名为board的类,它扩展了JComponent,我的主函数将board添加到JFrame中。根据我读到的内容,paint函数被隐式调用(不确定)。问题是,当我尝试打印瓷砖的x和y位置(被迭代)时,它会打印所有的x和y位置三次,这让我相信绘画被调用了不止一次

董事会级别:

class Board extends JComponent{
    Tile[][] board1;
    Board(Pieces p,boolean containPiece){   
        //initialize board
        board1 = board; // set attribute

    }
      public void paint(Graphics g){
          for(int i = 0; i < board1.length; i++){
              for(int j = 0; j < board1.length; j++){
                  g.fillRect(board1[j][i].xPosition+130, board1[j][i].yPosition+20,board1[j][i].tileWidth,board1[j][i].tileHeight);
                  System.out.println(j+ " "+ " " + i );
                  if((j+i)%2 == 0){
                      g.setColor(Color.BLACK);
                  }
                  else{
                      g.setColor(Color.WHITE);
                  }

              }
            }
          }
      }
输出如下(与代码格式不同,但内容相同),但重复两次以上:

0 0, 1 0, 2 0, 3 0, 4 0, 5 0, 6 0, 7 0,
0 1 ,1 1 ,2 1 ,3 1 ,4 1 ,5 1 ,6 1 ,7 1,
0 2 ,1 2 ,2 2 ,3 2 ,4 2 ,5 2 ,6 2 ,7 2 ,
0 3 ,1 3 ,2 3 ,3 3 ,4 3 ,5 3 ,6 3 ,7 3 ,
0 4 ,1 4 ,2 4 ,3 4 ,4 4 ,5 4 ,6 4 ,7 4,
0 5 ,1 5 ,2 5 ,3 5 ,4 5 ,5 5 ,6 5 ,7 5 ,
0 6 ,1 6 ,2 6 ,3 6 ,4 6 ,5 6 ,6 6 ,7 6 ,
0 7 ,1 7 ,2 7 ,3 7 ,4 7 ,5 7 ,6 7 ,7 7 

在系统触发的绘制操作中,系统请求组件渲染其内容,通常出于以下原因之一:

  • 组件首先在屏幕上可见
  • 组件已调整大小
  • 部件有损坏,需要修理。(例如,先前遮挡该组件的某个对象已移动,并且该组件先前遮挡的部分已暴露)

在系统触发的绘制操作中,系统请求组件渲染其内容,通常出于以下原因之一:

  • 组件首先在屏幕上可见
  • 组件已调整大小
  • 部件有损坏,需要修理。(例如,先前遮挡该组件的某个对象已移动,并且该组件先前遮挡的部分已暴露)

不会回答您的问题,但自定义绘制是通过覆盖
paintComponent()
not paint()完成的。注意,还应该重写类的
getPreferredSize()
方法,然后使用框架的
pack()
方法,而不是setBounds()方法。只有组件知道网格的正确大小。不会回答您的问题,但自定义绘制是通过覆盖
paintComponent()
not paint()完成的。注意,还应该重写类的
getPreferredSize()
方法,然后使用框架的
pack()
方法,而不是setBounds()方法。只有组件知道网格的正确大小。
0 0, 1 0, 2 0, 3 0, 4 0, 5 0, 6 0, 7 0,
0 1 ,1 1 ,2 1 ,3 1 ,4 1 ,5 1 ,6 1 ,7 1,
0 2 ,1 2 ,2 2 ,3 2 ,4 2 ,5 2 ,6 2 ,7 2 ,
0 3 ,1 3 ,2 3 ,3 3 ,4 3 ,5 3 ,6 3 ,7 3 ,
0 4 ,1 4 ,2 4 ,3 4 ,4 4 ,5 4 ,6 4 ,7 4,
0 5 ,1 5 ,2 5 ,3 5 ,4 5 ,5 5 ,6 5 ,7 5 ,
0 6 ,1 6 ,2 6 ,3 6 ,4 6 ,5 6 ,6 6 ,7 6 ,
0 7 ,1 7 ,2 7 ,3 7 ,4 7 ,5 7 ,6 7 ,7 7