I am trying to make a checkerboard given a template from a CS class I am taking. However, when I run it, nothing comes up on the screen. I am guessing I am missing some code to actually draw the squares onto the screen but I have tried a lot of things and still nothing.
import java.applet.Applet;
import java.awt.*;
import java.util.Random;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Checkers extends JApplet
{
private final int MAX_SIZE = 8;
private final int APP_WIDTH = 400;
private final int APP_HEIGHT = 400;
private final int MAXSIZE = 8;
Square[][] sq;
public void paint(Graphics page)
{
setBackground(Color.white);
fillBoard(page); // draws the method that will draw the checkers
setSize (APP_WIDTH,APP_HEIGHT);
}
public void fillBoard(Graphics page)
{
sq = new Square[8][8];
int x,y;
Color rb;
for (int row = 0; row < MAXSIZE; row++)
for (int col = 0; col < MAXSIZE; col++)
{
x = row * (APP_WIDTH/MAXSIZE);
y = col * (APP_HEIGHT/MAXSIZE);
if ( (row % 2) == (col % 2) )
rb = Color.red;
else
rb = Color.blue;
sq[row][col] = new Square (x, y, rb);
}
}
class Square
{
private int x, y = 0;
private Color c;
private boolean occupied;
private Color checkerColor;
public Square (int x, int y, Color c)
{
this.x = x;
this.y = y;
this.c = c;
}
public void setX (int x)
{
x = this.x;
}
public int getX ()
{
return x;
}
public void setY (int y)
{
y= this.y;
}
public int getY ()
{
return y;
}
public void setColor (Color c)
{
c = this.c;
}
public Color getColor ()
{
return c;
}
public void setOccupy (boolean occupied)
{
occupied = this.occupied;
}
public boolean getOccupy ()
{
return occupied;
}
public void setCheckerColor (Color c)
{
checkerColor = this.checkerColor;
}
public Color getCheckerColor ()
{
return checkerColor;
}
public String toString()
{
return ("X coordinate: " + x + "\nY coordinate:" + y + "\nSquare color: " + c);
}
public void draw (Graphics page)
{
page.setColor(c);
page.fillRect(x, y, 50, 50);
}
You never call
Square#draw
.Having said that, I would be wary about calling
fillBoard
every time thepaint
method is called, in fact I'd discourage you from overridingpaint
in the first place.What I might do is check to see if
sq
isnull
infillBoard
and only generate the array then. Back in the paint method, I would simply use a compound loop anddraw
each square.Instead of overriding
paint
ofJApplet
, you should start with something likeJPanel
and override it'spaintComponent
method, make sure you callsuper.paintComponent
!There are a number of reasons you should do this, but the main one here is
JApplet
is not double buffered, meaning you will get "flashes" as the drawing is updated.JPanel
is double buffered by default, saving you a lot of work and time having to implement your own solution...Once you've done this, take custom panel and add it to the applet.
I would move all the painting logic to it. Take a look at Performing Custom Painting for more details
Well as far as I could see unless I missed something you never actually called a repaint or paint or draw method. This code is set up differently than most other codes that I have seen trying to accomplish similar tasks and I don't really feel like figuring it all out but you have to actually call the method to draw the image. However, make sure that you pay close attention to where you call this method because it is rather important to place it correctly otherwise it may not serve its function correctly.