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