Removed use of Refreshable and replaced with several methods which update the GUI using SwingUtilities.invokeLater().
While not as clean as using ChangeListener, it completely decouples the Model and View aspects, and also avoids the need to manually paint() a hierarchy of components (a task best handled by Swing/AWT).
This commit is contained in:
@@ -5,21 +5,29 @@ import java.awt.event.MouseListener;
|
|||||||
import java.awt.event.MouseWheelEvent;
|
import java.awt.event.MouseWheelEvent;
|
||||||
import java.awt.event.MouseWheelListener;
|
import java.awt.event.MouseWheelListener;
|
||||||
|
|
||||||
|
import view.BoardPanel;
|
||||||
|
import view.TileSelectionPanel;
|
||||||
|
|
||||||
public class BoardPanelMouseListener implements MouseListener, MouseWheelListener {
|
public class BoardPanelMouseListener implements MouseListener, MouseWheelListener {
|
||||||
|
|
||||||
private final int col;
|
private final int col;
|
||||||
private final int row;
|
private final int row;
|
||||||
|
private final BoardPanel boardPanel;
|
||||||
private final PlayerController pc;
|
private final PlayerController pc;
|
||||||
|
private final TileSelectionPanel tsp;
|
||||||
|
|
||||||
public BoardPanelMouseListener(int row, int col, PlayerController pc) {
|
public BoardPanelMouseListener(BoardPanel boardPanel, TileSelectionPanel tsp, int row, int col, PlayerController pc) {
|
||||||
this.row = row;
|
this.row = row;
|
||||||
this.col = col;
|
this.col = col;
|
||||||
this.pc = pc;
|
this.pc = pc;
|
||||||
|
this.boardPanel = boardPanel;
|
||||||
|
this.tsp = tsp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {
|
||||||
pc.setCell(row, col);
|
pc.setCell(row, col);
|
||||||
|
boardPanel.updateIcons();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -49,6 +57,7 @@ public class BoardPanelMouseListener implements MouseListener, MouseWheelListene
|
|||||||
} else if (e.getWheelRotation() < 0) {
|
} else if (e.getWheelRotation() < 0) {
|
||||||
pc.decrementColor();
|
pc.decrementColor();
|
||||||
}
|
}
|
||||||
|
tsp.updateBorders();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,6 @@ import model.Move;
|
|||||||
public class PlayerController {
|
public class PlayerController {
|
||||||
private final CellPointer cell = new CellPointer(0, 0);
|
private final CellPointer cell = new CellPointer(0, 0);
|
||||||
|
|
||||||
private boolean current = true;
|
|
||||||
private boolean ready = false;
|
private boolean ready = false;
|
||||||
private TileColor color = TileColor.BLUE;
|
private TileColor color = TileColor.BLUE;
|
||||||
|
|
||||||
@@ -43,7 +42,6 @@ public class PlayerController {
|
|||||||
currentColor = (currentColor + colors.length - 1) % colors.length;
|
currentColor = (currentColor + colors.length - 1) % colors.length;
|
||||||
}
|
}
|
||||||
color = colors[currentColor];
|
color = colors[currentColor];
|
||||||
setCurrent(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void incrementColor() {
|
public void incrementColor() {
|
||||||
@@ -63,11 +61,6 @@ public class PlayerController {
|
|||||||
currentColor = (currentColor + 1) % colors.length;
|
currentColor = (currentColor + 1) % colors.length;
|
||||||
}
|
}
|
||||||
color = colors[currentColor];
|
color = colors[currentColor];
|
||||||
setCurrent(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isCurrent() {
|
|
||||||
return current;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isReady() {
|
public boolean isReady() {
|
||||||
@@ -84,8 +77,4 @@ public class PlayerController {
|
|||||||
public void setColor(TileColor clr) {
|
public void setColor(TileColor clr) {
|
||||||
color = clr;
|
color = clr;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCurrent(boolean current) {
|
|
||||||
this.current = current;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@ public class TSPMouseListener implements MouseListener{
|
|||||||
@Override
|
@Override
|
||||||
public void mouseClicked(MouseEvent arg0) {
|
public void mouseClicked(MouseEvent arg0) {
|
||||||
pc.setColor(tileColor);
|
pc.setColor(tileColor);
|
||||||
tsp.setCurrent(false);
|
tsp.updateBorders();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
package model;
|
package model;
|
||||||
|
|
||||||
import javax.security.auth.Refreshable;
|
|
||||||
|
|
||||||
import model.Board.TileColor;
|
import model.Board.TileColor;
|
||||||
import model.comController.RandomComController;
|
import model.comController.RandomComController;
|
||||||
import controller.PlayerController;
|
import controller.PlayerController;
|
||||||
|
|
||||||
public class Referee implements Refreshable {
|
public class Referee {
|
||||||
|
|
||||||
public enum Message {
|
public enum Message {
|
||||||
COM_TURN {
|
COM_TURN {
|
||||||
@@ -42,7 +40,6 @@ public class Referee implements Refreshable {
|
|||||||
private final PlayerController pc = new PlayerController();
|
private final PlayerController pc = new PlayerController();
|
||||||
|
|
||||||
private boolean playerTurn;
|
private boolean playerTurn;
|
||||||
private boolean refresh = true;
|
|
||||||
private int score = 0;
|
private int score = 0;
|
||||||
|
|
||||||
public Referee() {
|
public Referee() {
|
||||||
@@ -52,28 +49,16 @@ public class Referee implements Refreshable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void doSomething() {
|
public void doSomething() {
|
||||||
Move mv;
|
|
||||||
|
|
||||||
if (playerTurn && pc.isReady()) {
|
if (playerTurn && pc.isReady()) {
|
||||||
mv = pc.getMove();
|
Move mv = pc.getMove();
|
||||||
|
|
||||||
if (board.getTile(mv.getCell().r, mv.getCell().c) == TileColor.NONE) {
|
if (board.getTile(mv.getCell().r, mv.getCell().c) == TileColor.NONE) {
|
||||||
playToken(pc.getMove());
|
playToken(pc.getMove());
|
||||||
|
} else {
|
||||||
refresh = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
|
||||||
pc.denyMove();
|
pc.denyMove();
|
||||||
}
|
}
|
||||||
}
|
} else if (!playerTurn) {
|
||||||
|
Move mv = cc.getMove();
|
||||||
else if (!playerTurn) {
|
|
||||||
mv = cc.getMove();
|
|
||||||
|
|
||||||
playToken(mv);
|
playToken(mv);
|
||||||
|
|
||||||
refresh = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,11 +92,6 @@ public class Referee implements Refreshable {
|
|||||||
return board.getTile(r, c);
|
return board.getTile(r, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCurrent() {
|
|
||||||
return !refresh;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isOver() {
|
public boolean isOver() {
|
||||||
for (int r = 0; r < Board.NUM_ROWS; r++) {
|
for (int r = 0; r < Board.NUM_ROWS; r++) {
|
||||||
for (int c = 0; c < Board.NUM_COLS; c++) {
|
for (int c = 0; c < Board.NUM_COLS; c++) {
|
||||||
@@ -135,11 +115,6 @@ public class Referee implements Refreshable {
|
|||||||
incrementTurn();
|
incrementTurn();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void refresh() {
|
|
||||||
refresh = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void incrementScore() {
|
private void incrementScore() {
|
||||||
score++;
|
score++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,18 +3,17 @@ package view;
|
|||||||
import java.awt.GridLayout;
|
import java.awt.GridLayout;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
|
||||||
import javax.security.auth.Refreshable;
|
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import controller.BoardPanelMouseListener;
|
import controller.BoardPanelMouseListener;
|
||||||
|
|
||||||
import model.Board;
|
import model.Board;
|
||||||
import model.Referee;
|
import model.Referee;
|
||||||
|
|
||||||
public class BoardPanel extends JPanel implements Refreshable {
|
public class BoardPanel extends JPanel {
|
||||||
|
|
||||||
|
|
||||||
public static final URL BLUE_ICON = BoardPanel.class
|
public static final URL BLUE_ICON = BoardPanel.class
|
||||||
.getResource("/img/blue.png");
|
.getResource("/img/blue.png");
|
||||||
@@ -32,16 +31,18 @@ public class BoardPanel extends JPanel implements Refreshable {
|
|||||||
private final JLabel[][] board = new JLabel[Board.NUM_ROWS][Board.NUM_COLS];
|
private final JLabel[][] board = new JLabel[Board.NUM_ROWS][Board.NUM_COLS];
|
||||||
private final Referee referee;
|
private final Referee referee;
|
||||||
|
|
||||||
public BoardPanel(Referee ref) {
|
public BoardPanel(Referee ref, TileSelectionPanel tsp) {
|
||||||
referee = ref;
|
referee = ref;
|
||||||
setLayout(new GridLayout(Board.NUM_ROWS, Board.NUM_COLS));
|
setLayout(new GridLayout(Board.NUM_ROWS, Board.NUM_COLS));
|
||||||
|
|
||||||
for (int r = 0; r < Board.NUM_ROWS; r++) {
|
for (int r = 0; r < Board.NUM_ROWS; r++) {
|
||||||
for (int c = 0; c < Board.NUM_COLS; c++) {
|
for (int c = 0; c < Board.NUM_COLS; c++) {
|
||||||
board[r][c] = new JLabel(new ImageIcon(NONE_ICON));
|
board[r][c] = new JLabel(new ImageIcon(NONE_ICON));
|
||||||
BoardPanelMouseListener bpml = new BoardPanelMouseListener(r, c, referee.getPlayer());
|
BoardPanelMouseListener bpml = new BoardPanelMouseListener(this, tsp, r,
|
||||||
|
c, referee.getPlayer());
|
||||||
|
|
||||||
//separate listener on each JLabel? This should probably be changed.
|
// separate listener on each JLabel? This should probably be
|
||||||
|
// changed.
|
||||||
board[r][c].addMouseListener(bpml);
|
board[r][c].addMouseListener(bpml);
|
||||||
board[r][c].addMouseWheelListener(bpml);
|
board[r][c].addMouseWheelListener(bpml);
|
||||||
|
|
||||||
@@ -49,16 +50,12 @@ public class BoardPanel extends JPanel implements Refreshable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
refresh();
|
updateIcons();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void updateIcons() {
|
||||||
public boolean isCurrent() {
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
return true;
|
public void run() {
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void refresh() {
|
|
||||||
for (int r = 0; r < Board.NUM_ROWS; r++) {
|
for (int r = 0; r < Board.NUM_ROWS; r++) {
|
||||||
for (int c = 0; c < Board.NUM_COLS; c++) {
|
for (int c = 0; c < Board.NUM_COLS; c++) {
|
||||||
switch (referee.getTile(r, c)) {
|
switch (referee.getTile(r, c)) {
|
||||||
@@ -79,6 +76,7 @@ public class BoardPanel extends JPanel implements Refreshable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
repaint();
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,26 +3,19 @@ package view;
|
|||||||
import java.awt.GridBagConstraints;
|
import java.awt.GridBagConstraints;
|
||||||
import java.awt.GridBagLayout;
|
import java.awt.GridBagLayout;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import javax.security.auth.RefreshFailedException;
|
|
||||||
import javax.security.auth.Refreshable;
|
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
|
|
||||||
import model.Referee;
|
import model.Referee;
|
||||||
|
|
||||||
public class MainFrame extends JFrame {
|
public class MainFrame extends JFrame {
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
new MainFrame();
|
new MainFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final ArrayList<Refreshable> elements = new ArrayList<Refreshable>();
|
|
||||||
|
|
||||||
private final Referee game;
|
private final Referee game;
|
||||||
|
|
||||||
public MainFrame() {
|
public MainFrame() {
|
||||||
@@ -44,15 +37,9 @@ public class MainFrame extends JFrame {
|
|||||||
private void init() {
|
private void init() {
|
||||||
// Create objects.
|
// Create objects.
|
||||||
ScorePanel sp = new ScorePanel(game);
|
ScorePanel sp = new ScorePanel(game);
|
||||||
BoardPanel bp = new BoardPanel(game);
|
|
||||||
MessagePanel mp = new MessagePanel(game);
|
|
||||||
TileSelectionPanel tp = new TileSelectionPanel(game.getPlayer());
|
TileSelectionPanel tp = new TileSelectionPanel(game.getPlayer());
|
||||||
|
BoardPanel bp = new BoardPanel(game,tp);
|
||||||
// Add refreshables.
|
MessagePanel mp = new MessagePanel(game);
|
||||||
elements.add(sp);
|
|
||||||
elements.add(bp);
|
|
||||||
elements.add(mp);
|
|
||||||
elements.add(tp);
|
|
||||||
|
|
||||||
// Add stuff to panel.
|
// Add stuff to panel.
|
||||||
GridBagLayout layout = new GridBagLayout();
|
GridBagLayout layout = new GridBagLayout();
|
||||||
@@ -100,35 +87,14 @@ public class MainFrame extends JFrame {
|
|||||||
add(mp);
|
add(mp);
|
||||||
add(bp);
|
add(bp);
|
||||||
add(tp);
|
add(tp);
|
||||||
}
|
|
||||||
|
|
||||||
private void refresh() {
|
|
||||||
boolean change = false;
|
|
||||||
|
|
||||||
for (Refreshable r : elements) {
|
|
||||||
|
|
||||||
if (!game.isCurrent() || !r.isCurrent()) {
|
|
||||||
try {
|
|
||||||
r.refresh();
|
|
||||||
change = true;
|
|
||||||
} catch (RefreshFailedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (change) {
|
|
||||||
game.refresh();
|
|
||||||
repaint();
|
|
||||||
pack();
|
pack();
|
||||||
}
|
tp.updateBorders();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void run() {
|
private void run() {
|
||||||
while (!game.isOver()) {
|
while (!game.isOver()) {
|
||||||
game.doSomething();
|
game.doSomething();
|
||||||
|
|
||||||
refresh();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,16 +1,13 @@
|
|||||||
package view;
|
package view;
|
||||||
|
|
||||||
import javax.security.auth.Refreshable;
|
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import model.Referee;
|
import model.Referee;
|
||||||
|
|
||||||
public class MessagePanel extends JPanel implements Refreshable {
|
public class MessagePanel extends JPanel {
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private final JLabel message = new JLabel();
|
private final JLabel message = new JLabel();
|
||||||
@@ -21,13 +18,11 @@ public class MessagePanel extends JPanel implements Refreshable {
|
|||||||
add(message);
|
add(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void updateMessage() {
|
||||||
public boolean isCurrent() {
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
return true;
|
public void run() {
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void refresh() {
|
|
||||||
message.setText(referee.getMessage());
|
message.setText(referee.getMessage());
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
package view;
|
package view;
|
||||||
|
|
||||||
import javax.security.auth.Refreshable;
|
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import model.Referee;
|
import model.Referee;
|
||||||
|
|
||||||
public class ScorePanel extends JPanel implements Refreshable {
|
public class ScorePanel extends JPanel {
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private final JLabel message = new JLabel();
|
private final JLabel message = new JLabel();
|
||||||
@@ -21,13 +18,11 @@ public class ScorePanel extends JPanel implements Refreshable {
|
|||||||
add(message);
|
add(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void updateScore() {
|
||||||
public boolean isCurrent() {
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
return true;
|
public void run() {
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void refresh() {
|
|
||||||
message.setText("Score: " + referee.getScore());
|
message.setText("Score: " + referee.getScore());
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,19 +5,18 @@ import java.awt.GridBagConstraints;
|
|||||||
import java.awt.GridBagLayout;
|
import java.awt.GridBagLayout;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
|
|
||||||
import javax.security.auth.RefreshFailedException;
|
|
||||||
import javax.security.auth.Refreshable;
|
|
||||||
import javax.swing.BorderFactory;
|
import javax.swing.BorderFactory;
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import controller.PlayerController;
|
import controller.PlayerController;
|
||||||
import controller.TSPMouseListener;
|
import controller.TSPMouseListener;
|
||||||
|
|
||||||
import model.Board.TileColor;
|
import model.Board.TileColor;
|
||||||
|
|
||||||
public class TileSelectionPanel extends JPanel implements Refreshable {
|
public class TileSelectionPanel extends JPanel {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@@ -36,17 +35,9 @@ public class TileSelectionPanel extends JPanel implements Refreshable {
|
|||||||
initActions();
|
initActions();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void updateBorders() {
|
||||||
public boolean isCurrent() {
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
return pc.isCurrent();
|
public void run() {
|
||||||
}
|
|
||||||
|
|
||||||
public void setCurrent(boolean current) {
|
|
||||||
pc.setCurrent(current);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void refresh() throws RefreshFailedException {
|
|
||||||
TileColor tile = pc.getColor();
|
TileColor tile = pc.getColor();
|
||||||
|
|
||||||
blue.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
|
blue.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
|
||||||
@@ -56,20 +47,22 @@ public class TileSelectionPanel extends JPanel implements Refreshable {
|
|||||||
|
|
||||||
switch (tile) {
|
switch (tile) {
|
||||||
case GREEN:
|
case GREEN:
|
||||||
green.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
|
green.setBorder(BorderFactory
|
||||||
|
.createLineBorder(Color.RED, 3));
|
||||||
break;
|
break;
|
||||||
case RED:
|
case RED:
|
||||||
red.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
|
red.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
|
||||||
break;
|
break;
|
||||||
case YELLOW:
|
case YELLOW:
|
||||||
yellow.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
|
yellow.setBorder(BorderFactory.createLineBorder(Color.RED,
|
||||||
|
3));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
blue.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
|
blue.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pc.setCurrent(true);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initActions() {
|
private void initActions() {
|
||||||
|
|||||||
Reference in New Issue
Block a user