package jrummikub.view.impl; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.util.Collection; import java.util.Collections; import java.util.Map; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import jrummikub.model.Position; import jrummikub.model.Stone; import jrummikub.model.StoneSet; import jrummikub.view.ITable; @SuppressWarnings("serial") class Table extends StonePanel implements ITable { private final static ImageIcon background = new ImageIcon( Board.class.getResource("/jrummikub/resource/felt.png")); private final static float DEFAULT_SCALE = 1; private JLabel leftPlayerLabel, topPlayerLabel, rightPlayerLabel; private JPanel innerPanel; private StonePainter selectedStonePainter = new StonePainter(1.2f); private Map stoneSets = Collections.emptyMap(); private Collection selectedStones = Collections.emptyList(); @Override public void setLeftPlayerName(String playerName) { leftPlayerLabel.setText(playerName); } @Override public void setTopPlayerName(String playerName) { topPlayerLabel.setText(playerName); } @Override public void setRightPlayerName(String playerName) { rightPlayerLabel.setText(playerName); } @Override public void setStoneSets(Map stoneSets) { this.stoneSets = stoneSets; repaint(); } public void setSelectedStones(Collection stones) { selectedStones = stones; repaint(); } Table() { super(DEFAULT_SCALE); setLayout(new BorderLayout()); leftPlayerLabel = new JLabel(); leftPlayerLabel.setForeground(Color.WHITE); add(leftPlayerLabel, BorderLayout.WEST); topPlayerLabel = new JLabel(); topPlayerLabel.setHorizontalAlignment(JLabel.CENTER); topPlayerLabel.setHorizontalTextPosition(JLabel.CENTER); topPlayerLabel.setForeground(Color.WHITE); add(topPlayerLabel, BorderLayout.NORTH); rightPlayerLabel = new JLabel(); rightPlayerLabel.setForeground(Color.WHITE); add(rightPlayerLabel, BorderLayout.EAST); innerPanel = new JPanel(); innerPanel.setOpaque(false); add(innerPanel, BorderLayout.CENTER); } public void paintStoneSet(Graphics2D g, StoneSet stoneSet, Position pos) { float x = pos.getX(); int width = getStonePainter().getStoneWidth(), height = getStonePainter().getStoneHeight(); g.setColor(new Color(0, 0, 0, 0.25f)); g.fillRect((int)(x*width)-width/4, (int)(pos.getY()*height), width/4, height); for (Stone stone : stoneSet) { getStonePainter().paintStone(g, stone, new Position(x, pos.getY()), selectedStones.contains(stone)); x++; } g.setColor(new Color(0, 0, 0, 0.25f)); g.fillRect((int)(x*width), (int)(pos.getY()*height), width/4, height); } @Override protected void paintComponent(Graphics g1) { Graphics2D g = (Graphics2D) g1; for (int x = 0; x < getWidth(); x += background.getIconWidth()) { for (int y = 0; y < getHeight(); y += background.getIconHeight()) { background.paintIcon(this, g, x, y); } } g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); for (Map.Entry stoneSet : stoneSets.entrySet()) { paintStoneSet(g, stoneSet.getKey(), stoneSet.getValue()); } int selectedStonesWidth = getWidth() * 3 / 5 - 14; int selectedStonesHeight = selectedStonePainter.getStoneHeight(); int selectedStonesX = getWidth() / 2 - selectedStonesWidth / 2; int selectedStonesY = getHeight() - selectedStonesHeight - 12; if (!selectedStones.isEmpty()) { g.setColor(new Color(0, 0, 0, 0.3f)); g.fillRect(selectedStonesX - 7, selectedStonesY - 7, selectedStonesWidth + 14, selectedStonesHeight + 14); Graphics2D translatedG = (Graphics2D) g.create(selectedStonesX, selectedStonesY, selectedStonesWidth, selectedStonesHeight); float x = 0; for (Stone stone : selectedStones) { selectedStonePainter.paintStone(translatedG, stone, new Position(x, 0), false); x++; } } } }