Java JPanel不断地使用paintComponent绘制自己的图形

Java JPanel不断地使用paintComponent绘制自己的图形,java,swing,graphics,jpanel,paintcomponent,Java,Swing,Graphics,Jpanel,Paintcomponent,我编写了一个程序,在数组中包含一些相同类型的JPanel。 不管怎么说,这都很好 我的问题是,他们的绘画与图像是做得很好。 但它并没有停止,就好像它在一个循环中 代码如下: package Try1; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.io.File; import java.io.IOException; import java.util.Stack; im

我编写了一个程序,在数组中包含一些相同类型的JPanel。 不管怎么说,这都很好

我的问题是,他们的绘画与图像是做得很好。 但它并没有停止,就好像它在一个循环中

代码如下:

package Try1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.Stack;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

// slot is a defined place on the backgammon board that can hold 
// one type of pieces black or white.
//there are 24 slots 12 on each side and 6 in each quartor.
//if a slot holds 2 or more pieces those pieces cannot be eaten.
 public class Slot extends JPanel{
  private int ap=0;
  private int slotNumber;
  private int piecesAmount;
  private SlotType type;
  private Stack<WhitePiece> wPieces;
  private Stack<BlackPiece> bPieces;
  private Image wPieceImage;
  private Image bPieceImage;
  public Slot() throws IOException{
  setLayout(null);
  setOpaque(false);
  //setBackground(new Color(0,0,0,0));
  type = SlotType.empty;
  piecesAmount = 0;
  setSize(300,40);
  wPieces = new Stack<WhitePiece>();
  bPieces = new Stack<BlackPiece>();
  wPieceImage = ImageIO.read(new File("pics/whitePiece.png"));
  bPieceImage = ImageIO.read(new File("pics/blackPiece.png"));
 }
   public Slot(int pA, int sN, SlotType t) throws IOException{
  setLayout(null);
  setOpaque(false);
  if(t != SlotType.empty){
      piecesAmount = pA;
      slotNumber = sN;
      type = t;
      wPieces = new Stack<WhitePiece>();
      bPieces = new Stack<BlackPiece>();
      wPieceImage = ImageIO.read(new File("pics/whitePiece.png"));
      bPieceImage = ImageIO.read(new File("pics/blackPiece.png"));
      if(t == SlotType.black){
          for(int i=0;i<pA;i++)
              bPieces.push(new BlackPiece());
      }else{
          for(int i=0;i<pA;i++)
              wPieces.push(new WhitePiece());
      }
  }
 }
 public void paintComponent(Graphics g){    
  ap++;
  System.out.println(ap);
  super.paintComponent(g);
  if(type == SlotType.empty){ 
      System.out.println("no type selected slot is empty Slot  Number"+slotNumber);
  }else
      if(type == SlotType.white){
        if(!wPieces.isEmpty()){
        if(slotNumber <= 12){
          for(int i=0;i<piecesAmount;i++){
            g.drawImage( wPieceImage, 5, i*30, null);
          }
        }
        else{
            for(int i=0;i<piecesAmount;i++){
                g.drawImage(wPieceImage, 5,220-(i*30), null);
            }
       }
        System.out.println("Slot #"+slotNumber+" was drawed");
        }else{
            System.out.println("Slot Stack is Empty Slot #"+slotNumber);
        }
      }else
      {
        if(!bPieces.isEmpty()){
          if(slotNumber<=12){
             for(int i=0;i<piecesAmount;i++){
                g.drawImage(bPieceImage, 5, i*30, 30, 30, null);
            }
          }else{
              for(int i=0;i<piecesAmount;i++){
                    g.drawImage(bPieceImage, 5, 220-(i*30), 30, 30, null);
              }  
          }
    }
          else{
      System.out.println("Slot Stack is empty Slot #"+slotNumber);
   }
}

} 
public SlotType getType(){
  return type;
  }
   public void setType(SlotType t){
  if(piecesAmount == 0)
    type = t;
  }
  public int getPiecesAmount(){
  return piecesAmount;
  }
  public void setPiecesAmount(int pa) throws IOException{ 
  if(type != SlotType.empty){
      piecesAmount = pa;
      if(type == SlotType.black){
         if(pa>bPieces.size())
           for(int i=0;i<(pa-bPieces.size());i++)
              bPieces.push(new BlackPiece());
         else
             if(pa<bPieces.size())
                 for(int i=0;i<(bPieces.size()-pa);i++)
                     bPieces.pop();
     }
      else{
          if(pa>wPieces.size())
               for(int i=0;i<(pa-wPieces.size());i++)
                  wPieces.push(new WhitePiece());
             else
                 if(pa<wPieces.size())
                     for(int i=0;i<(wPieces.size()-pa);i++)
                         wPieces.pop();
      }
  }else{
      System.out.println("Slot #"+slotNumber+" is Empty Slot");
  }
  }
  public void decreasePiecesAmount(){
  if(type != SlotType.empty){
      piecesAmount --;
      if(type == SlotType.black)
          bPieces.pop();
      else
          wPieces.pop();
  }
 }
 public void increasePiecesAmount() throws IOException{
  if(type != SlotType.empty){
      piecesAmount ++;
      if(type == SlotType.black)
          bPieces.push(new BlackPiece());
      else
          wPieces.push(new WhitePiece());
  }
 }
 public void pushPiece(){

 } 

 protected void setSlotNumber(int sN){
  slotNumber = sN;
}
public int getSlotNumber(){
  return slotNumber;
}
public String toString(){
return "Slot #"+slotNumber+"\nSlot Type is: "+type.toString()+"\nAmount of pieces  is: "+piecesAmount;
  }
}
包Try1;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.io.File;
导入java.io.IOException;
导入java.util.Stack;
导入javax.imageio.imageio;
导入javax.swing.JPanel;
//插槽是双陆棋棋盘上的一个指定位置,可以容纳
//黑色或白色的一种。
//每侧有24个槽12,每四分之一中有6个槽。
//如果一个槽里有2块或更多的肉,这些肉就不能吃了。
公共类插槽扩展了JPanel{
私有int ap=0;
私用国际slotNumber;
私有整块数;
专用SlotType类型;
私有堆栈wPieces;
私有堆栈bpiec;
私有图像wPieceImage;
私密图像;
公共插槽()引发IOException{
setLayout(空);
设置不透明(假);
//挫折背景(新颜色(0,0,0,0));
type=SlotType.empty;
piecesAmount=0;
设置大小(300,40);
wPieces=新堆栈();
bPieces=新堆栈();
wPieceImage=ImageIO.read(新文件(“pics/whitePiece.png”);
bPieceImage=ImageIO.read(新文件(“pics/blackPiece.png”);
}
公共插槽(int pA、int sN、SlotType t)引发IOException{
setLayout(空);
设置不透明(假);
if(t!=SlotType.empty){
piecesAmount=pA;
slotNumber=sN;
类型=t;
wPieces=新堆栈();
bPieces=新堆栈();
wPieceImage=ImageIO.read(新文件(“pics/whitePiece.png”);
bPieceImage=ImageIO.read(新文件(“pics/blackPiece.png”);
if(t==SlotType.black){
对于(int i=0;i这就是问题所在:

public void drawBoard(Graphics g,Slot[][] board) throws IOException{
    for(int i=0;i<2;i++){
        for(int j=0;j<12;j++){
            board[i][j].repaint();
        }
    }
}
public void绘图板(图形g,插槽[][]板)引发IOException{

对于(int i=0;我明白了。如果我想移动一下,然后再画画,我叫什么?@GiladBenYe当位置改变时,你可以简单地调用主游戏板(
board
)的
repaint()
。(我想还有
repaint()
具有不同签名的方法,可用于请求仅重新绘制有限区域,但在优化之前使游戏正常运行)。
public void drawBoard(Graphics g,Slot[][] board) throws IOException{
    for(int i=0;i<2;i++){
        for(int j=0;j<12;j++){
            board[i][j].repaint();
        }
    }
}