2013-07-28 105 views
0

我寫了一個程序,其中包含幾個相同類型的JPanel在數組中。無論如何這就是所有的好和花花公子。JPanel不斷繪製自己與paintComponent

我的問題是,他們與圖像的繪畫做得非常好。 但它不會停止,就好像它在一個循環?

下面是代碼:

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

回答

1

這就是問題所在:

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

你叫drawBoard()paintComponent()repaint()不會做你認爲它做的事。它要求重新繪製組件。這最終將導致paintComponent()調用。這具有無盡的重新繪製的效果。

因爲它們是JComponents在您的遊戲板上,所以當板被塗漆時,swing將自動調用各自的paintComponent()方法。根本不需要drawBoard()

+0

我明白了。 如果我想要採取行動,而不是再次塗料,我打電話給我什麼? –

+0

@GiladBenYe當職位發生變化時,您可以簡單地調用主遊戲板('Board',我認爲)的'repaint()'。 (還有'repaint()'方法具有不同的簽名,可用於請求僅重繪有限的區域,但在優化之前讓遊戲運行)。 – kiheru

+0

好的,我看到謝謝。 –

相關問題