/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package tic.tac.toe.ui; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import tic.tac.toe.Mark; import tic.tac.toe.Pair; /** * The Gui to the Logical Board * * @author wolf.posdorfer * @version 16.06.2011 */ public class GameBoardPanel extends JPanel { private static final long serialVersionUID = -178497456422566485L; private Image _backgroundimage; private JLabel[][] _labels; private GamePanel _owner; public GameBoardPanel(GamePanel gamepanel) { _owner = gamepanel; setLayout(new GridLayout(3, 3)); _labels = new JLabel[3][3]; for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { JLabel toadd = new JLabel(Mark.BLANK.getImage()); toadd.setOpaque(false); final int xx = x; final int yy = y; toadd.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (_owner.myTurn() && _owner.isFree(xx, yy)) { placeMark(_owner.getMyMark(), xx, yy); } } }); _labels[x][y] = toadd; add(_labels[x][y]); } } ClassLoader cl = getClass().getClassLoader(); _backgroundimage = new ImageIcon(cl.getResource("board.png")) .getImage(); setPreferredSize(new Dimension(500, 500)); } /** * Places the Mark, and tells the Owner to place the mark on the logical * board * * @param m * @param x * @param y */ public void placeMark(Mark m, int x, int y) { _labels[x][y].setIcon(m.getImage()); // Notify the Owner about Change _owner.onGameBoardPlaceMark(m, x, y); this.invalidate(); this.repaint(); this.revalidate(); } public void colorizeWinners(Pair[] pairs) { if(pairs!=null) { for(Pair p : pairs) { _labels[p.getX()][p.getY()].setIcon(p.getMark().getRedImage()); } } this.repaint(); this.revalidate(); } public void paintComponent(Graphics g) { super.paintComponent(g); final Image backgroundImage = _backgroundimage; double scaleX = getWidth() / (double) backgroundImage.getWidth(null); double scaleY = getHeight() / (double) backgroundImage.getHeight(null); AffineTransform xform = AffineTransform .getScaleInstance(scaleX, scaleY); ((Graphics2D) g).drawImage(backgroundImage, xform, this); } }