Questions about PuzzleModel, PuzzleView/Gui, PuzzleController

  1. The following method is part of PuzzleGui, this method is called as part of the initialization of that class. Explain the purpose of the method (do a best guess based on the names of the parameters and variables).
        private void constrainResize()
    	addComponentListener(new ComponentAdapter(){
    		public void componentResized(ComponentEvent e)
    		    int w = getWidth();
    		    int h = getHeight();
    		    w = Math.max(w,h);

  2. In the PuzzleGui class the private instance variable myUndo is of type JMenuItem. Here's the code that initializes this variable. In broad terms, explain each major part of this initialization.
    	myUndo = new JMenuItem(new AbstractAction("Undo")
    		public void actionPerformed(ActionEvent e) {

  3. The code below creates moveMaker, an object which is attached to each of the n2 JButtons in a PuzzleGui view that's the view of an n x n puzzle. Why is it possible to share the same object among all the buttons, e.g., rather than using a different button-specific listener for each button? (explain what happens when a button is pressed based on the code below).
      ActionListener moveMaker = new ActionListener(){
             public void actionPerformed(ActionEvent e)
    	    int val = Integer.parseInt(e.getActionCommand());
                myControl.makeMove(new PuzzleMove(val));

  4. The code below from PuzzleModel makes a move in the model. Explain based on best-guess information (based on the names of the methods and variables) the purpose of the statements in the scope of the if statement that calls isNeighbors. Note: the instance field myList stores all moves for the purpose of undo.
        private boolean doMove(PuzzleMove move, boolean doStore)
    	int index = getIndex(move.getValue());
    	int blankIndex = getIndex(getBlankValue());
    	if (isNeighbors(index,blankIndex)) {
    	    int temp = myNumbers[blankIndex];
    	    myNumbers[blankIndex] = myNumbers[index];
    	    myNumbers[index] = temp;
    	    if (doStore){
    	    return true;
    	return false;	
  5. The code below is from PuzzleModel. Explain each line of this function. The instance variable myList is of type java.util.LinkedList rather than ArrayList because the latter field doesn't have a method removeLast.
         * Undoes the last move (if there is one) and returns true iff
         * another undo is possible
         * @return true if another undo is possible, else returns false
        public boolean undo()
    	if (myList.size() != 0) {
    	    doMove((PuzzleMove) myList.removeLast(),false);
    	return myList.size() > 0;

    IconCounterCounter Questions

  6. The IconCounterCounter class static method getCount returns the number of times it's called with a specific parameter, e.g., it returns 1 the first time called with a parameter whose value is the image for "blarg.jpg", 2 the second time called with the same parameter, etc. The prototype is:
        public static int getCount(Image im)

    Internally, the IconCounterCounter class uses a HashMap to store an image and its associated count of how many times getCount has been called.

    If a TreeMap is used instead of a HashMap internally, the code will compile fine. However, when the PuzzleApp program is run, the following class-cast exception is generated. Explain this.

    Exception in thread "main" java.lang.ClassCastException:
            at java.util.TreeMap.getEntry(
            at java.util.TreeMap.get(
            at IconCounterCounter.getCount(