java - 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;

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;
  }
}

这是包含该类的类的代码:

    package Try1;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    public class Board extends JPanel {
      private int drawedAmount = 0;
      private Slot[][] board;  
      private Image image;
      private Image wpieceImage;
      private Image bpieceImage;
      public Board() throws IOException{
      setLayout(null);
      board = new Slot[2][12];
      image = ImageIO.read(new File("pics/board.png"));
      wpieceImage = ImageIO.read(new File("pics/whitePiece.png"));
      bpieceImage = ImageIO.read(new File("pics/blackPiece.png"));
      JLabel ap = new JLabel(String.valueOf(drawedAmount));
      ap.setBounds(210,10,30,40);
      add(ap);
     }
      public void paintComponent(Graphics page)
      {
      super.paintComponent(page);
      page.drawImage(image, 0, 0, null);
      try {
        drawBoard(page,board);
        drawedAmount++;
    } catch (IOException e) {
        e.printStackTrace();
    }
      /*
      //first 2
      page.drawImage(bpieceImage, 123, 20, null);
      page.drawImage(bpieceImage, 123, 50, null);
      //5 blacks
      page.drawImage(wpieceImage, 350, 20, null);
      page.drawImage(wpieceImage, 350, 50, null);
      page.drawImage(wpieceImage, 350, 80, null);
      page.drawImage(wpieceImage, 350, 110, null);
      page.drawImage(wpieceImage, 350, 140, null);
      // 3 whites
      page.drawImage(wpieceImage, 472, 20, null);
      page.drawImage(wpieceImage, 472, 50, null);
      page.drawImage(wpieceImage, 472, 80, null);
      //5 blacks
      page.drawImage(bpieceImage, 650, 20, null);
      page.drawImage(bpieceImage, 650, 50, null);
      page.drawImage(bpieceImage, 650, 80, null);
      page.drawImage(bpieceImage, 650, 110, null);
      page.drawImage(bpieceImage, 650, 140, null);

      //2 whites
      page.drawImage(wpieceImage, 124, 577, null);
      page.drawImage(wpieceImage, 124, 547, null);
      //5 blacks
      page.drawImage(bpieceImage, 348, 577, null);
      page.drawImage(bpieceImage, 348, 547, null);
      page.drawImage(bpieceImage, 348, 517, null);
      page.drawImage(bpieceImage, 348, 487, null);
      page.drawImage(bpieceImage, 348, 457, null);
      //3 blacks
      page.drawImage(bpieceImage, 470, 577, null);
      page.drawImage(bpieceImage, 470, 547, null);
      page.drawImage(bpieceImage, 470, 517, null);
      //5 whites
      page.drawImage(wpieceImage, 650, 577, null);
      page.drawImage(wpieceImage, 650, 547, null);
      page.drawImage(wpieceImage, 650, 517, null);
      page.drawImage(wpieceImage, 650, 487, null);
      page.drawImage(wpieceImage, 650, 457, null); */
      }
      //resets board to the start of backgammon.
      public void resetBoard() throws IOException{
      //setting slot numbers.
      for(int i=0;i<2;i++)
      for(int j=0;j<12;j++){
          if(i==0){
              board[i][j] = new Slot();
              board[i][j].setSlotNumber(j+1);
          }
          else{
              board[i][j] = new Slot();
              board[i][j].setSlotNumber(23-j+1);
          }
      }
      // #1
      board[0][0].setType(SlotType.black);
      board[0][0].setPiecesAmount(2);
      System.out.println(board[0][0].toString());
      // #6
      board[0][5].setType(SlotType.white);
      board[0][5].setPiecesAmount(5);
      System.out.println(board[0][5].toString());
      // #8
      board[0][7].setType(SlotType.white);
      board[0][7].setPiecesAmount(3);
      System.out.println(board[0][7].toString());
      // #12
      board[0][11].setType(SlotType.black);
      board[0][11].setPiecesAmount(5);
      System.out.println(board[0][11].toString());
      // #13
      board[1][11].setType(SlotType.white);
      board[1][11].setPiecesAmount(5);
      System.out.println(board[1][11].toString());
      // # 17
      board[1][7].setType(SlotType.black);
      board[1][7].setPiecesAmount(3);
      System.out.println(board[1][7].toString());
      // #19
      board[1][5].setType(SlotType.black);
      board[1][5].setPiecesAmount(5);
      System.out.println(board[1][5].toString());
      // #24
      board[1][0].setType(SlotType.white);
      board[1][0].setPiecesAmount(2);
      System.out.println(board[1][0].toString());

      //setting bounds for all slots.
      for(int i=0;i<2;i++)
          for(int j=0;j<12;j++)
              if(i==0){
                  if(j<=6){
                       board[i][j].setBounds((j*45)+118,20,40,250);
                       add(board[i][j]);
                  }
                  else{
                       board[i][j].setBounds(((j-7)*56)+422,20,40,250);
                       add(board[i][j]);
                  }
              }
              else{
                  if(j<=6){
                      board[i][j].setBounds((j*45)+118,360,40,250);
                      add(board[i][j]);
                  }
                  else{
                      board[i][j].setBounds(((j-7)*56)+422,360,40,250);
                      add(board[i][j]);
                  }

              }
      }

      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 movePiece(int fslotNumber,int lslotNumber) throws IOException{
      //find the slot in which piece is loacted.
      int []firstSlotPosition= new int[2];
      int dobreak=1;
      for(int i=0;i<2;i++){
          for(int j=0;j<12;j++){
              if(board[i][j].getSlotNumber()==fslotNumber){
                  firstSlotPosition[0]=i;
                  firstSlotPosition[1]=j;
                  dobreak=0;
                  break;
              }
          }
          if(dobreak==0)
              break;
        }
      //find the slot that piece should move to.
      int []finalSlotPosition= new int[2];
      int dobreak2=1;
      for(int i=0;i<2;i++){
          for(int j=0;j<12;j++){
              if(board[i][j].getSlotNumber()==lslotNumber){
                  finalSlotPosition[0]=i;
                  finalSlotPosition[1]=j;
                  dobreak2=0;
                  break;
              }
          }
          if(dobreak2==0)
              break;
        }
         // make move
         // if the place where we want to move is empty set type 
        // and if its taken by another color dont make move.
         boolean makeMove = true;
         if(board[finalSlotPosition[0]][finalSlotPosition[1]].getType()==SlotType.empty){
             board[finalSlotPosition[0]][finalSlotPosition[1]].setType(board[firstSlotPosition[0]][firstSlotPosition[1]].getType());
         }else
             if(board[finalSlotPosition[0]][finalSlotPosition[1]].getType()!=board[firstSlotPosition[0]][firstSlotPosition[1]].getType()){
                System.out.println("move canceled!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                makeMove = false;
             }
         if(makeMove==true){
         board[firstSlotPosition[0]][firstSlotPosition[1]].decreasePiecesAmount();
         board[finalSlotPosition[0]][finalSlotPosition[1]].increasePiecesAmount();
         }
        }
}

最佳答案

这就是问题:

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();
        }
    }
}

您从 paintComponent() 调用 drawBoard()repaint() 并没有像你想象的那样做。它请求重新绘制组件。这最终将导致 paintComponent() 调用。这具有无限重画的效果。

由于它们是游戏板上的 JComponent,因此在绘制游戏板时,swing 将自动调用它们各自的 paintComponent() 方法。您根本不需要 drawBoard()

关于java - JPanel不断地用paintComponent绘制自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17911528/

相关文章:

java - 如果我仅使用 Web 服务,如何实现 SPARQL 端点公共(public)

java - 如何使用箭头键绘制线条(线段)?

algorithm - 将一个凸多边形拟合到另一个多边形中

android - 为什么某些 Android 设备可能会使用更多的图形内存来运行相同的应用程序?

java - 当外观和感觉发生变化时如何动态更改图标?

java - JFrame 不绘制矩形

Android登录注册中java.lang.String无法转换为JSONObject

java - 服务器响应(JSON 格式)到数组转换

java - 拥有 Collection Listener 的好方法?

java - Swing:与标签相比的复选框间距