import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* IgoImagePanel クラスは、描画ベースの碁盤イメージを提供します。
* @author Jiro Suzuki
*/
public class IgoImagePanel extends IgoPanel{
private static final int FONTSIZE=31;
private static final int BANSIZEX=630;
private static final int BANSIZEY=630;
private static final int BOX=32;
private static final int ROSU=19;
private static final Color BOARD_COLOR=new Color(242,216,140);
private static final Color WHITE_STONE_COLOR=new Color(253,253,253);
private static final Color OUTLINE_COLOR=new Color(180,180,180);
private IgoModel controller;
private IntBoard intBoard;
private Image image;
private Graphics painter;
private boolean isPutable;
/**
* 石が置かれていない碁盤イメージのインスタンスを生成します。
*/
IgoImagePanel(){
intBoard=new IntBoard();
isPutable=false;
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent me){
if(isPutable){
boolean isOnBoardRow=false;
boolean isOnBoardCol=false;
int x=me.getX();
int y=me.getY();
int minX,minY,row,col;
for(row=0;row<ROSU;row++){
minY=row*BOX+11;
if(y>=minY && y<minY+BOX){
isOnBoardRow=true;
break;
}
}
for(col=0;col<ROSU;col++){
minX=col*BOX+11;
if(x>=minX && x<minX+BOX){
isOnBoardCol=true;
break;
}
}
if(isOnBoardRow && isOnBoardCol){
controller.putStone(row,col);
}
}
}
});
}
/**
* グラフィックベースの碁盤を描画します。
* @param g 保護対象の Graphics オブジェクト
*/
public void paintComponent(Graphics g){
super.paintComponent(g);
image=createImage(BANSIZEX,BANSIZEY);
painter=image.getGraphics();
//盤の描画
painter.setColor(BOARD_COLOR);
painter.fillRect(0,0,BANSIZEX,BANSIZEY);
painter.setColor(Color.black);
//線の描画
for(int i=0;i<ROSU;i++){
painter.drawLine(BOX*i+BOX/2+10,BOX/2+10,BOX*i+BOX/2+10,BOX*(ROSU-1)+BOX/2+10); //縦線
painter.drawLine(BOX/2+10,BOX*i+BOX/2+10,BOX*(ROSU-1)+BOX/2+10,BOX*i+BOX/2+10); //横線
}
//星の描画
int dx;
int dy;
for(int ix_dx=0;ix_dx<3;ix_dx++){
dx=BOX/2+BOX*3-3+BOX*6*ix_dx;
for(int ix_dy=0;ix_dy<3;ix_dy++){
dy=BOX/2+BOX*3-3+BOX*6*ix_dy;
painter.fillOval(dx+10,dy+10,6,6);
}
}
//石の描画
int[][] ban=intBoard.getIntBoard();
for(int row=0;row<ROSU;row++){
for(int col=0;col<ROSU;col++){
switch (ban[row][col]){
case 1: //黒石の描画
painter.setColor(Color.black);
painter.fillOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
break;
case 2: //白石の描画
painter.setColor(WHITE_STONE_COLOR);
painter.fillOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
painter.setColor(OUTLINE_COLOR);
painter.drawOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
break;
case 11: //黒石の描画
painter.setColor(Color.black);
painter.fillOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
painter.setColor(Color.green);
painter.fillOval(col*BOX+19,row*BOX+19,BOX-20,BOX-20);
break;
case 12: //白石の描画
painter.setColor(WHITE_STONE_COLOR);
painter.fillOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
painter.setColor(OUTLINE_COLOR);
painter.drawOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
painter.setColor(Color.green);
painter.fillOval(col*BOX+19,row*BOX+19,BOX-20,BOX-20);
break;
}
}
}
g.drawImage(image,0,0,this);
}
/**
* 描画ベースの碁盤を更新します。
* @param intBoard 碁盤に見立てた行列に、石の色を配置した碁盤データ
*/
public void update(IntBoard intBoard){
this.intBoard=intBoard;
repaint();
}
/**
* コントローラーを設定します。
* @param controller コントローラー
*/
public void setIgoGameController(IgoModel controller){
this.controller=controller;
isPutable=true;
}
}