Hi, I'm writing a Java program that prints a grid with circles and squares that have letters in them and it is also supposed to print the toString() function to the console window each time the application runs. This toString() function is supposed to show the tile's shape, letter, and color component (or components). Could someone please review and debug my code to help me figure out why my toString() function is not working?
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Random;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Font;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Ellipse2D.Double;
import java.util.ArrayList;
// This class inherits what is in JPanel
class Tile extends JPanel {
private int red, green, blue, letGen, shapes;
private String [] alphabetlist = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q",
"R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
private String letter;
// Getter for shapes
public int getShapes() {
return shapes;
}
// Setter for shapes
public void setShapes() {
this.shapes = shapes;
}
// Getter for letter
public int getLetter() {
return letter;
}
// Setter for letter
public void setLetter() {
this.letter = letter;
}
@Override
public String toString() {
return String.format("Tile shape: %s\nLetter in tile: %s\nColor component(s) of tile: ", shapes, letter);
}
// Constructor for the class
Tile() {
super(); // Calls super class constructor
SetRandomValues(); // Constructor to set random values
}
// This is to prevent someone from messing with your constructor
final public void SetRandomValues() {
red = GetNumberBetween(0,255); // Calling the method GetNumberBetween
green = GetNumberBetween(0,255); // Calls the method GetNumberBetween
blue = GetNumberBetween(0,255); // Calls the method GetNumberBetween
letGen = GetNumberBetween(0,25); // Generates a letter from the alphabet between A - Z
letter = alphabetlist[letGen];
shapes = GetNumberBetween(0,1);
}
// Gets a letter between two letters
private static int GetNumberBetween(int min, int max) {
Random someRandomLetter = new Random();
return min + someRandomLetter.nextInt(max-min+1); // Returns a random letter
}
public void paintComponent(Graphics g) {
super.paintComponent(g); // Calls the super class's paintComponent
int panelWidth = getWidth(); // Gets the width
int panelHeight = getHeight(); // Gets the height
g.setColor(new Color(red,green,blue)); // Sets the color to the random color we created in the code above
// 0 draws a circle
if (shapes == 0) {
Graphics2D g2d = (Graphics2D)g;
Ellipse2D.Double circle = new Ellipse2D.Double(10, 10, panelWidth-20, panelHeight-20);
g2d.fill(circle); // Fills the panel with circles in the middle
}
else {
g.fillRect(10, 10, panelWidth-20, panelHeight-20); // Fills the panel with rectangles in the middle
}
// This sets the contrasting color so we can see the text in the boxes
g.setColor(new Color(GetContrastingColor(red),GetContrastingColor(green),GetContrastingColor(blue)));
final int fontSize=10; // Sets the font size
g.setFont(new Font("Arial", Font.PLAIN, fontSize)); // Sets the font type, normal font
int stringX = (panelWidth/2)-30; // Sets the position we want to draw the font at for the x position to center the font
int stringY = (panelHeight/2)+30; // Sets the position we want to draw the font at for the y position to center the font
g.drawString(letter,stringX,stringY);
}
// Makes sure that we have a contrasting color
private static int GetContrastingColor(int colorIn) {
return ((colorIn+128)%256);
}
}
class TileFrame extends JFrame implements ActionListener {
private ArrayList<Tile> tileList; // creates a private arraylist called tilelist
// Default constructor
public TileFrame() {
setBounds(200,200,1200,800); // Sets the bounds for the JFrame/window
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Places X button on the screen so that the Frame/window closes
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel buttonPanel = new JPanel();
contentPane.add(buttonPanel, BorderLayout.SOUTH); // Adds button panel to the south of the BorderLayout
JButton randomize = new JButton("Randomize!"); // Creates new "Randomize" button
buttonPanel.add(randomize); // Adds randomize to buttonPanel
randomize.addActionListener(this); // Adds ActionListener on "randomize" button - the "this" is our JFrame
JPanel lettersGridPanel = new JPanel(); // Creates a panel called lettersGridPanel - holds all letters
contentPane.add(lettersGridPanel, BorderLayout.CENTER); // Adds lettersGridPanel to the center of the BorderLayout
lettersGridPanel.setLayout(new GridLayout(10,10)); // Sets this to a 10x10 GridLayout
tileList = new ArrayList<Tile>(); // Initializes tilelist as an arraylist
// For loop which goes through this loop 100 times (creates 100 tiles, adds each of the 100 tiles to the grid)
for(int i=1; i<101; i++) {
Tile tile = new Tile(); // Creates a new Tile object
tileList.add(tile); // Adds tilelist to tile
lettersGridPanel.add(tile); // Adds lettersGridPanel to tile
}
}
public void actionPerformed(ActionEvent e) {
// When the button is pushed in tileList, we tell each item within tileList them to randomize themselves
for(Tile tile : tileList) {
tile.SetRandomValues();
}
repaint();
}
}
public class Mosaic {
public static void main(String[] args) {
System.out.println("Start paint***");
// Creates new frame
TileFrame myTileFrame = new TileFrame();
myTileFrame.setVisible(true); // Makes the frame visible
}
}
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Random;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Font;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Ellipse2D.Double;
import java.util.ArrayList;
// This class inherits what is in JPanel
class Tile extends JPanel {
private int red, green, blue, letGen, shapes;
private String [] alphabetlist = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q",
"R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
Color cc;
private String letter;
// Getter for shapes
public int getShapes() {
return shapes;
}
// Setter for shapes
public void setShapes() {
this.shapes = shapes;
}
// Getter for letter
public String getLetter() {
return letter;
}
// Setter for letter
public void setLetter() {
this.letter = letter;
}
@Override
public String toString() {
String str;
if(shapes==0) str="Circle";
else str="Square";
//return String.format("Tile shape: %d\nLetter in tile: %s\nColor component(s) of tile: ", shapes, letter);
//Color do not stores name of the color and it is very
hard to identify colors by comparing these Red, Green, Blue
values.
//it is not possible to return color name. because total we have
256*256*256 (16,777,216) distinct colors may not be named
colors.
//but we can return red, green and blue values of the color.
return String.format("Tile Shape:"+str+"\n Lettler in
tile:"+letter+"\n Color component(s) of tile:"+cc.getRed()+"
"+cc.getGreen()+" "+cc.getBlue());
}
// Constructor for the class
Tile() {
super(); // Calls super class constructor
SetRandomValues(); // Constructor to set random values
}
// This is to prevent someone from messing with your constructor
final public void SetRandomValues() {
red = GetNumberBetween(0,255); // Calling the method GetNumberBetween
green = GetNumberBetween(0,255); // Calls the method GetNumberBetween
blue = GetNumberBetween(0,255); // Calls the method GetNumberBetween
letGen = GetNumberBetween(0,25); // Generates a letter from the alphabet between A - Z
letter = alphabetlist[letGen];
shapes = GetNumberBetween(0,1);
}
// Gets a letter between two letters
private static int GetNumberBetween(int min, int max) {
Random someRandomLetter = new Random();
return min + someRandomLetter.nextInt(max-min+1); // Returns a random letter
}
public void paintComponent(Graphics g) {
super.paintComponent(g); // Calls the super class's paintComponent
int panelWidth = getWidth(); // Gets the width
int panelHeight = getHeight(); // Gets the height
// Sets the color to the random color we created in the code above
cc=new Color(red,green,blue);
g.setColor(cc);
//g.setColor(new Color(red,green,blue));
// 0 draws a circle
if (shapes == 0) {
Graphics2D g2d = (Graphics2D)g;
Ellipse2D.Double circle = new Ellipse2D.Double(10, 10, panelWidth-20, panelHeight-20);
g2d.fill(circle); // Fills the panel with circles in the middle
}
else {
g.fillRect(10, 10, panelWidth-20, panelHeight-20); // Fills the panel with rectangles in the middle
}
// This sets the contrasting color so we can see the text in the boxes
g.setColor(new Color(GetContrastingColor(red),GetContrastingColor(green),GetContrastingColor(blue)));
final int fontSize=10; // Sets the font size
g.setFont(new Font("Arial", Font.PLAIN, fontSize)); // Sets the font type, normal font
int stringX = (panelWidth/2)-30; // Sets the position we want to draw the font at for the x position to center the font
int stringY = (panelHeight/2)+30; // Sets the position we want to draw the font at for the y position to center the font
g.drawString(letter,stringX,stringY);
System.out.println(toString());
}
// Makes sure that we have a contrasting color
private static int GetContrastingColor(int colorIn) {
return ((colorIn+128)%256);
}
}
class TileFrame extends JFrame implements ActionListener {
private ArrayList<Tile> tileList; // creates a private arraylist called tilelist
// Default constructor
public TileFrame() {
setBounds(200,200,1200,800); // Sets the bounds for the JFrame/window
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Places X button on the screen so that the Frame/window closes
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel buttonPanel = new JPanel();
contentPane.add(buttonPanel, BorderLayout.SOUTH); // Adds button panel to the south of the BorderLayout
JButton randomize = new JButton("Randomize!"); // Creates new "Randomize" button
buttonPanel.add(randomize); // Adds randomize to buttonPanel
randomize.addActionListener(this); // Adds ActionListener on "randomize" button - the "this" is our JFrame
JPanel lettersGridPanel = new JPanel(); // Creates a panel called lettersGridPanel - holds all letters
contentPane.add(lettersGridPanel, BorderLayout.CENTER); // Adds lettersGridPanel to the center of the BorderLayout
lettersGridPanel.setLayout(new GridLayout(10,10)); // Sets this to a 10x10 GridLayout
tileList = new ArrayList<Tile>(); // Initializes tilelist as an arraylist
// For loop which goes through this loop 100 times (creates 100 tiles, adds each of the 100 tiles to the grid)
for(int i=1; i<101; i++) {
Tile tile = new Tile(); // Creates a new Tile object
tileList.add(tile); // Adds tilelist to tile
lettersGridPanel.add(tile); // Adds lettersGridPanel to tile
}
}
public void actionPerformed(ActionEvent e) {
// When the button is pushed in tileList, we tell each item within tileList them to randomize themselves
for(Tile tile : tileList) {
tile.SetRandomValues();
}
repaint();
}
}
public class Mosaic {
public static void main(String[] args) {
System.out.println("Start paint***");
// Creates new frame
TileFrame myTileFrame = new TileFrame();
myTileFrame.setVisible(true); // Makes the frame visible
}
}
Get Answers For Free
Most questions answered within 1 hours.