SlideShare a Scribd company logo
Working with Layout Managers. Notes: 1. In part 2, note that the Game class inherits from
JPanel. Therefore, the panel you are asked to add to the center of the content pane is the "game"
object. 2. In part 4, at the end of the function, call validate(). This is not mentioned in the book,
but it is mentioned in the framework comments.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Game extends JPanel
{
private JButton [][] squares;
private TilePuzzle game;
public Game( int newSide )
{
game = new TilePuzzle( newSide );
setUpGameGUI( );
}
public void setUpGame( int newSide )
{
game.setUpGame( newSide );
setUpGameGUI( );
}
public void setUpGameGUI( )
{
removeAll( ); // remove all components
setLayout( new GridLayout( game.getSide( ),
game.getSide( ) ) );
squares = new JButton[game.getSide( )][game.getSide( )];
ButtonHandler bh = new ButtonHandler( );
// for each button: generate button label,
// instantiate button, add to container,
// and register listener
for ( int i = 0; i < game.getSide( ); i++ )
{
for ( int j = 0; j < game.getSide( ); j++ )
{
squares[i][j] = new JButton( game.getTiles( )[i][j] );
add( squares[i][j] );
squares[i][j].addActionListener( bh );
}
}
setSize( 300, 300 );
setVisible( true );
}
private void update( int row, int col )
{
for ( int i = 0; i < game.getSide( ); i++ )
{
for ( int j = 0; j < game.getSide( ); j++ )
{
squares[i][j].setText( game.getTiles( )[i][j] );
}
}
if ( game.won( ) )
{
JOptionPane.showMessageDialog( Game.this,
"Congratulations! You won! Setting up new game" );
// int sideOfPuzzle = 3 + (int) ( 4 * Math.random( ) );
// setUpGameGUI( );
}
}
private class ButtonHandler implements ActionListener
{
public void actionPerformed( ActionEvent ae )
{
for( int i = 0; i < game.getSide( ); i++ )
{
for( int j = 0; j < game.getSide( ); j++ )
{
if ( ae.getSource( ) == squares[i][j] )
{
if ( game.tryToPlay( i, j ) )
update( i, j );
return;
} // end if
} // end inner for loop
} // outer for loop
} // end actionPerformed method
} // end ButtonHandler class
} // end Game class
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class NestedLayoutPractice extends JFrame
{
private Container contents;
private Game game;
private BorderLayout bl;
private JLabel bottom;
// ***** Task 1: declare a JPanel named top
// also declare three JButton instance variables
// that will be added to the JPanel top
// these buttons will determine the grid size of the game:
// 3-by-3, 4-by-4, or 5-by-5
// Part 1 student code starts here:
// Part 1 student code ends here.
public NestedLayoutPractice()
{
super("Practicing layout managers");
contents = getContentPane();
// ***** Task 2:
// instantiate the BorderLayout manager bl
// Part 2 student code starts here:
// set the layout manager of the content pane contents to bl:
game = new Game(3); // instantiating the GamePanel object
// add panel (game) to the center of the content pane
// Part 2 student code ends here.
bottom = new JLabel("Have fun playing this Tile Puzzle game",
SwingConstants.CENTER);
// ***** Task 3:
// instantiate the JPanel component named top
// Part 3 student code starts here:
// set the layout of top to a 1-by-3 grid
// instantiate the JButtons that determine the grid size
// add the buttons to JPanel top
// add JPanel top to the content pane as its north component
// Part 3 student code ends here.
// ***** Task 5:
// Note: search for and complete Task 4 before performing this task
// Part 5 student code starts here:
// declare and instantiate an ActionListener
// register the listener on the 3 buttons
// that you declared in Task 1
// Part 5 student code ends here.
contents.add(bottom, BorderLayout.SOUTH);
setSize(325, 325);
setVisible(true);
}
// ***** Task 4:
// create a private inner class that implements ActionListener
// your method should identify which of the 3 buttons
// was the source of the event
// depending on which button was pressed,
// call the setUpGame method of the Game class
// with arguments 3, 4, or 5
// the API of that method is:
// public void setUpGame(int nSides)
// At the end of the method call validate()
// Part 4 student code starts here:
// Part 4 student code ends here.
public static void main(String[] args)
{
NestedLayoutPractice nl = new NestedLayoutPractice();
nl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
public class TilePuzzle
{
private int side; // grid size for game 1
private String[][] tiles;
private int emptyRow;
private int emptyCol;
public TilePuzzle( int newSide )
{
setUpGame( newSide );
}
public void setUpGame( int newSide )
{
if ( side > 0 )
side = newSide;
else
side = 3;
side = newSide;
tiles = new String[side][side];
emptyRow = side - 1;
emptyCol = side - 1;
for ( int i = 0; i < side; i++ )
{
for ( int j = 0; j < side; j++ )
{
tiles[i][j] = String.valueOf( ( side * side )
- ( side * i + j + 1 ) );
}
}
// set empty tile to blank
tiles[side - 1][side - 1] = "";
}
public int getSide( )
{
return side;
}
/*
public int getEmptyRow( )
{
return emptyRow;
}
public int getEmptyCol( )
{
return emptyCol;
}
*/
public String[][] getTiles( )
{
return tiles;
}
public boolean tryToPlay( int row, int col )
{
if ( possibleToPlay( row, col ) )
{
// play: switch empty String and tile label at row, col
tiles[emptyRow][emptyCol] = tiles[row][col];
tiles[row][col] = "";
emptyRow = row;
emptyCol = col;
return true;
}
else
return false;
}
public boolean possibleToPlay( int row, int col )
{
if ( ( col == emptyCol && Math.abs( row - emptyRow ) == 1 )
|| ( row == emptyRow && Math.abs( col - emptyCol ) == 1 ) )
return true;
else
return false;
}
public boolean won( )
{
for ( int i = 0; i < side ; i++ )
{
for ( int j = 0; j < side; j++ )
{
if ( !( tiles[i][j].equals(
String.valueOf( i * side + j + 1 ) ) )
&& ( i != side - 1 || j != side - 1 ) )
return false;
}
}
return true;
}
}
Programming Activity 12-2 Guidance
==================================
Overview
--------
There are 5 parts.
Make sure you complete the parts in numerical order.
Notice that part 4 occurs in the code after part 5.
As stated in the part 5 comments, you should complete part 4 before
part 5 because part 5 has a step that says:
"// declare and instantiate an ActionListener"
This ActionListener must be an object of the private inner button handler class
that you write in part 4.
The 5 parts of 12-2 each have helpful comments.
The comments will guide you about what code to write.
Button instantiation
--------------------
Suppose you define a button as follows:
JButton three;
To instantiate it with its label set to "3 x 3", you would write:
three = new JButton("3 x 3");
Part 2
------
Note that the Game class inherits from JPanel.
Therefore, the panel you are asked to add to the center of the
content pane is the "game" object.
Part 4 button handler
---------------------
You have to create a private inner class to handle events from any
of the three game setup buttons.
This course is cumulative. Each new chapter builds on previous chapters.
Week 4 had a video called Java GUI Button Components.
The code for that video was supplied in a folder in week 4.
Here is a section of the code shown in that video:
private class CommandHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if (source == btnDisplayTrees)
{
displayTrees();
return;
}
if (source == btnDisplayWater)
{
displayWater();
return;
}
if (source == btnPackWindow)
{
packWindow();
return;
}
if (source == btnReset)
{
reset();
return;
}
}
etc.
The above code shows a private inner class named CommandHandler that
handles button events. You can name your button handler whatever you want,
such as ButtonHandler, but you must use the same name in part 5 after the comment:
// declare and instantiate an ActionListener
In the above video example, there is an if test for each button event.
Each of the if blocks does something and then returns.
In your button handler, you also have to do a certain thing for each button
as specified in the comments. However, you cannot then simply return because
validate() must be called at the end of the function--no matter which button
was clicked. There are 2 simple ways to achieve this:
1) Use nested if/else's followed by the validate() call, or
2) Call validate() after each button's processing and then return
from each one as in the video example.
Part 4 setUpGame()
------------------
The part 4 comments include:
// depending on which button was pressed,
// call the setUpGame method of the Game class
// with arguments 3, 4, or 5
// the API of that method is:
// public void setUpGame(int nSides)
To call a function we need an object of its class.
Does our framework code have an object for us of type Game?
Looking near the beginning of the NestedLayoutPractice class
that we are in, you will see the following declaration:
private Game game;
So, game is an object reference of type Game that we can use.
Your framework starting code already includes the following line
of code in part 2:
game = new Game(3); // instantiating the GamePanel object
This is where the game object is actually created. It is passed
a value of 3 in the constructor call. This will cause the game
to be created with 3 rows by 3 columns of numbered squares.
Now back to your part 4 handler comments. The comments say to change
the game setup as instructed based on which button was clicked.
If you look at the example user interface you will see that there
are 3 buttons to change the game to 3 x 3, or 4 x 4, or 5 x 5 squares.
You should have already declared these buttons in part 1 and created
them in part 3 as instructed.
In part 4, your event handler function must handle when each of the
buttons is clicked. If, for exaample, the 4 x 4 button is clicked, then
you should have the following line of code for that event:
game.setUpGame(4);
Don't overthink this. It is a simple function call using the game
object, its setUpGame() method, and a literal parameter of 4.
At the end of the function, call
Solution
NestedLayoutPractice.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class NestedLayoutPractice extends JFrame
{
private Container contents;
private Game game;
private BorderLayout bl;
private JLabel bottom;
private JPanel top;
private JButton btnDisplayTrees;
private JButton btnDisplayWater;
private JButton btnPackWindow;
// ***** Task 1: declare a JPanel named top
// also declare three JButton instance variables
// that will be added to the JPanel top
// these buttons will determine the grid size of the game:
// 3-by-3, 4-by-4, or 5-by-5
// Part 1 student code starts here:
// Part 1 student code ends here.
public NestedLayoutPractice(){
super("Practicing layout managers");
contents = getContentPane();
// ***** Task 2:
// instantiate the BorderLayout manager bl
bl = new BorderLayout();
// Part 2 student code starts here:
// set the layout manager of the content pane contents to bl:-------
bl.layoutContainer(contents);
game = new Game(3); // instantiating the GamePanel object
// add panel (game) to the center of the content pane
contents.add(game);
// Part 2 student code ends here.
bottom = new JLabel("Have fun playing this Tile Puzzle game",
SwingConstants.CENTER);
// ***** Task 3:
// instantiate the JPanel component named top
top = new JPanel();
// Part 3 student code starts here:
top.setLayout(new GridLayout(1, 3, 5, 5));
// set the layout of top to a 1-by-3 grid--------
// instantiate the JButtons that determine the grid size
btnDisplayTrees = new JButton("3 x 3");
btnDisplayWater = new JButton("4 x 4");
btnPackWindow = new JButton("5 x 5");
// add the buttons to JPanel top
top.add(btnDisplayTrees);
top.add(btnDisplayWater);
top.add(btnPackWindow);
// add JPanel top to the content pane as its north component
top.add(contents,BorderLayout.NORTH);
// Part 3 student code ends here.
// ***** Task 5:
// Note: search for and complete Task 4 before performing this task
// Part 5 student code starts here:
// declare and instantiate an ActionListener
CommandHandler ch = new CommandHandler();
// register the listener on the 3 buttons
btnDisplayTrees.addActionListener(ch);
btnDisplayWater.addActionListener(ch);
btnPackWindow.addActionListener(ch);
// that you declared in Task 1
// Part 5 student code ends here.
contents.add(bottom, BorderLayout.SOUTH);
setSize(325, 325);
setVisible(true);
}
// ***** Task 4:
// create a private inner class that implements ActionListener
// your method should identify which of the 3 buttons
// was the source of the event
// depending on which button was pressed,
// call the setUpGame method of the Game class
// with arguments 3, 4, or 5
// the API of that method is:
// public void setUpGame(int nSides)
// At the end of the method call validate()
// Part 4 student code starts here:
// Part 4 student code ends here.
private class CommandHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
Object source = e.getSource();
if (source == btnDisplayTrees){
//displayTrees();
game.setUpGame(3);
game.validate();
return;
}
if (source == btnDisplayWater){
// displayWater();
game.setUpGame(4);
game.validate();
return;
}
if (source == btnPackWindow){
//packWindow();
game.setUpGame(5);
game.validate();
return;
}
// if (source == btnReset){
// reset();
// return;
// }
}
}
public static void main(String[] args){
NestedLayoutPractice nl = new NestedLayoutPractice();
nl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

More Related Content

PDF
Here are the instructions and then the code in a sec. Please R.pdf
PDF
Please help with this. program must be written in C# .. All of the g.pdf
PDF
Need help writing the code for a basic java tic tac toe game Tic.pdf
PDF
Practice using layouts Anderson, Franceschi import javax..pdf
PDF
Java ProgrammingImplement an auction application with the followin.pdf
DOCX
New microsoft office word document
DOCX
TilePUzzle class Anderson, Franceschi public class TilePu.docx
PDF
I really need some help if I have this right so far. PLEASE CHANG.pdf
Here are the instructions and then the code in a sec. Please R.pdf
Please help with this. program must be written in C# .. All of the g.pdf
Need help writing the code for a basic java tic tac toe game Tic.pdf
Practice using layouts Anderson, Franceschi import javax..pdf
Java ProgrammingImplement an auction application with the followin.pdf
New microsoft office word document
TilePUzzle class Anderson, Franceschi public class TilePu.docx
I really need some help if I have this right so far. PLEASE CHANG.pdf

Similar to Working with Layout Managers. Notes 1. In part 2, note that the Gam.pdf (20)

PDF
I really need some help if I have this right so far. Please Resub.pdf
DOCX
CodeZipButtonDemo.javaCodeZipButtonDemo.java Demonstrate a p.docx
DOCX
CodeZipButtonDemo.javaCodeZipButtonDemo.java Demonstrate a p.docx
PPT
Graphical User Components Part 2
DOCX
#include iostream#include fstream#include Opening.h.docx
PDF
Tic Tac Toe game with GUI written in java.SolutionAnswerimp.pdf
PDF
You will write a multi-interface version of the well-known concentra.pdf
PDF
ObjectiveCreate a graphical game of minesweeper IN JAVA. The boar.pdf
PDF
learning_Pygame_Basics_Part _1f_for_beginner.pdf
PDF
Why am I getting an out of memory error and no window of my .pdf
PDF
Tic Tac Toe game with GUI please dont copy and paste from google. .pdf
PDF
Hi my question pretains to Java programing, What I am creating is a .pdf
PDF
I am sorry but my major does not cover programming in depth (ICT) an.pdf
PPTX
Java oops features
PDF
I dont know what is wrong with this roulette program I cant seem.pdf
PPTX
PDF
CalculatorProject.pdf
PDF
Html5 game, websocket e arduino
PDF
In Java using Eclipse, Im suppose to write a class that encapsulat.pdf
PPTX
Games, AI, and Research - Part 2 Training (FightingICE AI Programming)
I really need some help if I have this right so far. Please Resub.pdf
CodeZipButtonDemo.javaCodeZipButtonDemo.java Demonstrate a p.docx
CodeZipButtonDemo.javaCodeZipButtonDemo.java Demonstrate a p.docx
Graphical User Components Part 2
#include iostream#include fstream#include Opening.h.docx
Tic Tac Toe game with GUI written in java.SolutionAnswerimp.pdf
You will write a multi-interface version of the well-known concentra.pdf
ObjectiveCreate a graphical game of minesweeper IN JAVA. The boar.pdf
learning_Pygame_Basics_Part _1f_for_beginner.pdf
Why am I getting an out of memory error and no window of my .pdf
Tic Tac Toe game with GUI please dont copy and paste from google. .pdf
Hi my question pretains to Java programing, What I am creating is a .pdf
I am sorry but my major does not cover programming in depth (ICT) an.pdf
Java oops features
I dont know what is wrong with this roulette program I cant seem.pdf
CalculatorProject.pdf
Html5 game, websocket e arduino
In Java using Eclipse, Im suppose to write a class that encapsulat.pdf
Games, AI, and Research - Part 2 Training (FightingICE AI Programming)
Ad

More from udit652068 (20)

PDF
Discuss briefly and with examples, What key measures need to be take.pdf
PDF
Did BP respond in a manner that was appropriate with the oil spill t.pdf
PDF
Describe and provide at least two examples of direct transmission of.pdf
PDF
Define VRIO in business strategy Define VRIO in business strat.pdf
PDF
Define e-commerce and describe how it differs from e-business.So.pdf
PDF
Building Social Business - EssaySolutionBuilding social busine.pdf
PDF
You are to write a C++ program to produce an inventory repor.pdf
PDF
Write a java program that would ask the user to enter an input file .pdf
PDF
Which of the following defines a method doubleEach that returns an ar.pdf
PDF
When the Fed provides more reserves toprovides more reserves to.pdf
PDF
What is a common infrastructure and what does it provideSolutio.pdf
PDF
What are the eukaryotic kingdomsQuestion 4 optionsBacteria, Ar.pdf
PDF
What are some of the commonly seen WLAN devices What role does each.pdf
PDF
Using the header(dlist) and mainline file (dlistapp) belowYou are .pdf
PDF
Virology.Explain the make up and role of different complexes for .pdf
PDF
TOPOLOGY 541Let M be a set with two members a and b. Define the fu.pdf
PDF
These are the outputs which should match they are 4 of them -outp.pdf
PDF
The test solution is made basic and drops of 0.1 M Ca(NO3)2 are adde.pdf
PDF
The selection of officials in which of the following branches of the.pdf
PDF
the distance between the N-terminal and C-ternimal amino acids varie.pdf
Discuss briefly and with examples, What key measures need to be take.pdf
Did BP respond in a manner that was appropriate with the oil spill t.pdf
Describe and provide at least two examples of direct transmission of.pdf
Define VRIO in business strategy Define VRIO in business strat.pdf
Define e-commerce and describe how it differs from e-business.So.pdf
Building Social Business - EssaySolutionBuilding social busine.pdf
You are to write a C++ program to produce an inventory repor.pdf
Write a java program that would ask the user to enter an input file .pdf
Which of the following defines a method doubleEach that returns an ar.pdf
When the Fed provides more reserves toprovides more reserves to.pdf
What is a common infrastructure and what does it provideSolutio.pdf
What are the eukaryotic kingdomsQuestion 4 optionsBacteria, Ar.pdf
What are some of the commonly seen WLAN devices What role does each.pdf
Using the header(dlist) and mainline file (dlistapp) belowYou are .pdf
Virology.Explain the make up and role of different complexes for .pdf
TOPOLOGY 541Let M be a set with two members a and b. Define the fu.pdf
These are the outputs which should match they are 4 of them -outp.pdf
The test solution is made basic and drops of 0.1 M Ca(NO3)2 are adde.pdf
The selection of officials in which of the following branches of the.pdf
the distance between the N-terminal and C-ternimal amino acids varie.pdf
Ad

Recently uploaded (20)

PDF
Physiotherapy_for_Respiratory_and_Cardiac_Problems WEBBER.pdf
PDF
01-Introduction-to-Information-Management.pdf
PPTX
Final Presentation General Medicine 03-08-2024.pptx
PDF
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
PDF
Sports Quiz easy sports quiz sports quiz
PDF
O5-L3 Freight Transport Ops (International) V1.pdf
PDF
O7-L3 Supply Chain Operations - ICLT Program
PPTX
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
PDF
Insiders guide to clinical Medicine.pdf
PPTX
Pharma ospi slides which help in ospi learning
PDF
Complications of Minimal Access Surgery at WLH
PPTX
human mycosis Human fungal infections are called human mycosis..pptx
PPTX
Cell Types and Its function , kingdom of life
PPTX
Cell Structure & Organelles in detailed.
PDF
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
PDF
TR - Agricultural Crops Production NC III.pdf
PPTX
BOWEL ELIMINATION FACTORS AFFECTING AND TYPES
PPTX
PPH.pptx obstetrics and gynecology in nursing
PDF
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
PPTX
Renaissance Architecture: A Journey from Faith to Humanism
Physiotherapy_for_Respiratory_and_Cardiac_Problems WEBBER.pdf
01-Introduction-to-Information-Management.pdf
Final Presentation General Medicine 03-08-2024.pptx
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
Sports Quiz easy sports quiz sports quiz
O5-L3 Freight Transport Ops (International) V1.pdf
O7-L3 Supply Chain Operations - ICLT Program
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
Insiders guide to clinical Medicine.pdf
Pharma ospi slides which help in ospi learning
Complications of Minimal Access Surgery at WLH
human mycosis Human fungal infections are called human mycosis..pptx
Cell Types and Its function , kingdom of life
Cell Structure & Organelles in detailed.
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
TR - Agricultural Crops Production NC III.pdf
BOWEL ELIMINATION FACTORS AFFECTING AND TYPES
PPH.pptx obstetrics and gynecology in nursing
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
Renaissance Architecture: A Journey from Faith to Humanism

Working with Layout Managers. Notes 1. In part 2, note that the Gam.pdf

  • 1. Working with Layout Managers. Notes: 1. In part 2, note that the Game class inherits from JPanel. Therefore, the panel you are asked to add to the center of the content pane is the "game" object. 2. In part 4, at the end of the function, call validate(). This is not mentioned in the book, but it is mentioned in the framework comments. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Game extends JPanel { private JButton [][] squares; private TilePuzzle game; public Game( int newSide ) { game = new TilePuzzle( newSide ); setUpGameGUI( ); } public void setUpGame( int newSide ) { game.setUpGame( newSide ); setUpGameGUI( ); } public void setUpGameGUI( ) { removeAll( ); // remove all components setLayout( new GridLayout( game.getSide( ), game.getSide( ) ) ); squares = new JButton[game.getSide( )][game.getSide( )]; ButtonHandler bh = new ButtonHandler( ); // for each button: generate button label, // instantiate button, add to container, // and register listener for ( int i = 0; i < game.getSide( ); i++ ) { for ( int j = 0; j < game.getSide( ); j++ ) {
  • 2. squares[i][j] = new JButton( game.getTiles( )[i][j] ); add( squares[i][j] ); squares[i][j].addActionListener( bh ); } } setSize( 300, 300 ); setVisible( true ); } private void update( int row, int col ) { for ( int i = 0; i < game.getSide( ); i++ ) { for ( int j = 0; j < game.getSide( ); j++ ) { squares[i][j].setText( game.getTiles( )[i][j] ); } } if ( game.won( ) ) { JOptionPane.showMessageDialog( Game.this, "Congratulations! You won! Setting up new game" ); // int sideOfPuzzle = 3 + (int) ( 4 * Math.random( ) ); // setUpGameGUI( ); } } private class ButtonHandler implements ActionListener { public void actionPerformed( ActionEvent ae ) { for( int i = 0; i < game.getSide( ); i++ ) { for( int j = 0; j < game.getSide( ); j++ ) { if ( ae.getSource( ) == squares[i][j] ) { if ( game.tryToPlay( i, j ) )
  • 3. update( i, j ); return; } // end if } // end inner for loop } // outer for loop } // end actionPerformed method } // end ButtonHandler class } // end Game class import javax.swing.*; import java.awt.*; import java.awt.event.*; public class NestedLayoutPractice extends JFrame { private Container contents; private Game game; private BorderLayout bl; private JLabel bottom; // ***** Task 1: declare a JPanel named top // also declare three JButton instance variables // that will be added to the JPanel top // these buttons will determine the grid size of the game: // 3-by-3, 4-by-4, or 5-by-5 // Part 1 student code starts here: // Part 1 student code ends here. public NestedLayoutPractice() { super("Practicing layout managers"); contents = getContentPane(); // ***** Task 2: // instantiate the BorderLayout manager bl // Part 2 student code starts here: // set the layout manager of the content pane contents to bl: game = new Game(3); // instantiating the GamePanel object // add panel (game) to the center of the content pane // Part 2 student code ends here. bottom = new JLabel("Have fun playing this Tile Puzzle game",
  • 4. SwingConstants.CENTER); // ***** Task 3: // instantiate the JPanel component named top // Part 3 student code starts here: // set the layout of top to a 1-by-3 grid // instantiate the JButtons that determine the grid size // add the buttons to JPanel top // add JPanel top to the content pane as its north component // Part 3 student code ends here. // ***** Task 5: // Note: search for and complete Task 4 before performing this task // Part 5 student code starts here: // declare and instantiate an ActionListener // register the listener on the 3 buttons // that you declared in Task 1 // Part 5 student code ends here. contents.add(bottom, BorderLayout.SOUTH); setSize(325, 325); setVisible(true); } // ***** Task 4: // create a private inner class that implements ActionListener // your method should identify which of the 3 buttons // was the source of the event // depending on which button was pressed, // call the setUpGame method of the Game class // with arguments 3, 4, or 5 // the API of that method is: // public void setUpGame(int nSides) // At the end of the method call validate() // Part 4 student code starts here: // Part 4 student code ends here. public static void main(String[] args) { NestedLayoutPractice nl = new NestedLayoutPractice(); nl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  • 5. } } public class TilePuzzle { private int side; // grid size for game 1 private String[][] tiles; private int emptyRow; private int emptyCol; public TilePuzzle( int newSide ) { setUpGame( newSide ); } public void setUpGame( int newSide ) { if ( side > 0 ) side = newSide; else side = 3; side = newSide; tiles = new String[side][side]; emptyRow = side - 1; emptyCol = side - 1; for ( int i = 0; i < side; i++ ) { for ( int j = 0; j < side; j++ ) { tiles[i][j] = String.valueOf( ( side * side ) - ( side * i + j + 1 ) ); } } // set empty tile to blank tiles[side - 1][side - 1] = ""; } public int getSide( ) { return side;
  • 6. } /* public int getEmptyRow( ) { return emptyRow; } public int getEmptyCol( ) { return emptyCol; } */ public String[][] getTiles( ) { return tiles; } public boolean tryToPlay( int row, int col ) { if ( possibleToPlay( row, col ) ) { // play: switch empty String and tile label at row, col tiles[emptyRow][emptyCol] = tiles[row][col]; tiles[row][col] = ""; emptyRow = row; emptyCol = col; return true; } else return false; } public boolean possibleToPlay( int row, int col ) { if ( ( col == emptyCol && Math.abs( row - emptyRow ) == 1 ) || ( row == emptyRow && Math.abs( col - emptyCol ) == 1 ) ) return true; else return false;
  • 7. } public boolean won( ) { for ( int i = 0; i < side ; i++ ) { for ( int j = 0; j < side; j++ ) { if ( !( tiles[i][j].equals( String.valueOf( i * side + j + 1 ) ) ) && ( i != side - 1 || j != side - 1 ) ) return false; } } return true; } } Programming Activity 12-2 Guidance ================================== Overview -------- There are 5 parts. Make sure you complete the parts in numerical order. Notice that part 4 occurs in the code after part 5. As stated in the part 5 comments, you should complete part 4 before part 5 because part 5 has a step that says: "// declare and instantiate an ActionListener" This ActionListener must be an object of the private inner button handler class that you write in part 4. The 5 parts of 12-2 each have helpful comments. The comments will guide you about what code to write. Button instantiation -------------------- Suppose you define a button as follows: JButton three; To instantiate it with its label set to "3 x 3", you would write: three = new JButton("3 x 3");
  • 8. Part 2 ------ Note that the Game class inherits from JPanel. Therefore, the panel you are asked to add to the center of the content pane is the "game" object. Part 4 button handler --------------------- You have to create a private inner class to handle events from any of the three game setup buttons. This course is cumulative. Each new chapter builds on previous chapters. Week 4 had a video called Java GUI Button Components. The code for that video was supplied in a folder in week 4. Here is a section of the code shown in that video: private class CommandHandler implements ActionListener { public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == btnDisplayTrees) { displayTrees(); return; } if (source == btnDisplayWater) { displayWater(); return; } if (source == btnPackWindow) { packWindow(); return; } if (source == btnReset) { reset();
  • 9. return; } } etc. The above code shows a private inner class named CommandHandler that handles button events. You can name your button handler whatever you want, such as ButtonHandler, but you must use the same name in part 5 after the comment: // declare and instantiate an ActionListener In the above video example, there is an if test for each button event. Each of the if blocks does something and then returns. In your button handler, you also have to do a certain thing for each button as specified in the comments. However, you cannot then simply return because validate() must be called at the end of the function--no matter which button was clicked. There are 2 simple ways to achieve this: 1) Use nested if/else's followed by the validate() call, or 2) Call validate() after each button's processing and then return from each one as in the video example. Part 4 setUpGame() ------------------ The part 4 comments include: // depending on which button was pressed, // call the setUpGame method of the Game class // with arguments 3, 4, or 5 // the API of that method is: // public void setUpGame(int nSides) To call a function we need an object of its class. Does our framework code have an object for us of type Game? Looking near the beginning of the NestedLayoutPractice class that we are in, you will see the following declaration: private Game game; So, game is an object reference of type Game that we can use. Your framework starting code already includes the following line of code in part 2: game = new Game(3); // instantiating the GamePanel object This is where the game object is actually created. It is passed a value of 3 in the constructor call. This will cause the game
  • 10. to be created with 3 rows by 3 columns of numbered squares. Now back to your part 4 handler comments. The comments say to change the game setup as instructed based on which button was clicked. If you look at the example user interface you will see that there are 3 buttons to change the game to 3 x 3, or 4 x 4, or 5 x 5 squares. You should have already declared these buttons in part 1 and created them in part 3 as instructed. In part 4, your event handler function must handle when each of the buttons is clicked. If, for exaample, the 4 x 4 button is clicked, then you should have the following line of code for that event: game.setUpGame(4); Don't overthink this. It is a simple function call using the game object, its setUpGame() method, and a literal parameter of 4. At the end of the function, call Solution NestedLayoutPractice.java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class NestedLayoutPractice extends JFrame { private Container contents; private Game game; private BorderLayout bl; private JLabel bottom; private JPanel top; private JButton btnDisplayTrees; private JButton btnDisplayWater; private JButton btnPackWindow; // ***** Task 1: declare a JPanel named top // also declare three JButton instance variables // that will be added to the JPanel top // these buttons will determine the grid size of the game:
  • 11. // 3-by-3, 4-by-4, or 5-by-5 // Part 1 student code starts here: // Part 1 student code ends here. public NestedLayoutPractice(){ super("Practicing layout managers"); contents = getContentPane(); // ***** Task 2: // instantiate the BorderLayout manager bl bl = new BorderLayout(); // Part 2 student code starts here: // set the layout manager of the content pane contents to bl:------- bl.layoutContainer(contents); game = new Game(3); // instantiating the GamePanel object // add panel (game) to the center of the content pane contents.add(game); // Part 2 student code ends here. bottom = new JLabel("Have fun playing this Tile Puzzle game", SwingConstants.CENTER); // ***** Task 3: // instantiate the JPanel component named top top = new JPanel(); // Part 3 student code starts here: top.setLayout(new GridLayout(1, 3, 5, 5)); // set the layout of top to a 1-by-3 grid-------- // instantiate the JButtons that determine the grid size btnDisplayTrees = new JButton("3 x 3"); btnDisplayWater = new JButton("4 x 4"); btnPackWindow = new JButton("5 x 5"); // add the buttons to JPanel top top.add(btnDisplayTrees); top.add(btnDisplayWater); top.add(btnPackWindow); // add JPanel top to the content pane as its north component top.add(contents,BorderLayout.NORTH); // Part 3 student code ends here.
  • 12. // ***** Task 5: // Note: search for and complete Task 4 before performing this task // Part 5 student code starts here: // declare and instantiate an ActionListener CommandHandler ch = new CommandHandler(); // register the listener on the 3 buttons btnDisplayTrees.addActionListener(ch); btnDisplayWater.addActionListener(ch); btnPackWindow.addActionListener(ch); // that you declared in Task 1 // Part 5 student code ends here. contents.add(bottom, BorderLayout.SOUTH); setSize(325, 325); setVisible(true); } // ***** Task 4: // create a private inner class that implements ActionListener // your method should identify which of the 3 buttons // was the source of the event // depending on which button was pressed, // call the setUpGame method of the Game class // with arguments 3, 4, or 5 // the API of that method is: // public void setUpGame(int nSides) // At the end of the method call validate() // Part 4 student code starts here: // Part 4 student code ends here. private class CommandHandler implements ActionListener{ public void actionPerformed(ActionEvent e){ Object source = e.getSource(); if (source == btnDisplayTrees){ //displayTrees(); game.setUpGame(3); game.validate(); return;
  • 13. } if (source == btnDisplayWater){ // displayWater(); game.setUpGame(4); game.validate(); return; } if (source == btnPackWindow){ //packWindow(); game.setUpGame(5); game.validate(); return; } // if (source == btnReset){ // reset(); // return; // } } } public static void main(String[] args){ NestedLayoutPractice nl = new NestedLayoutPractice(); nl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }