Java JPanel不断地使用paintComponent绘制自己的图形
我编写了一个程序,在数组中包含一些相同类型的JPanel。 不管怎么说,这都很好 我的问题是,他们的绘画与图像是做得很好。 但它并没有停止,就好像它在一个循环中 代码如下: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
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();
}
}
}