Chris Pollett>Old Classes>PIC 20, Winter 2000>Hw5>Hw5 Solutions

Winter 2000 PIC 20 HW5 Solutions Page

Problem 12.11
=============

// Program Name: Printer.java
//
// Purpose:  This application pops a window that would be appropriate
//	     to configure the printing options for an Epson Printer.
//	     It is supposed to look like the window drawn in D&D but
//	     it does not do anything besides draw the window.
//	     
//
// Known Bugs: None
//	
//


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Printer extends JFrame
{
	Container c;
	JPanel leftPanel = new JPanel();
	JPanel outer = new JPanel();


	// Function Name: Printer
	//
	// Purpose: sets the name on title bar, sets layout add the two
	//	    add the two outermost panels
	//
	// Known Bugs: 
	//		

	public Printer()
	{
		super("Printer");

		c = getContentPane();
		c.setLayout(new FlowLayout(FlowLayout.CENTER));

		outer.setLayout(new BorderLayout());

		addLeftPanel();
		addButtonPanel();

		c.add(outer);

		setSize(480,170);
		show();

	}



	// Function Name: addLeftPanel
	//
	// Purpose: add everythings except four buttons on right 
	//	    
	//
	// Known Bugs: 
	//		

	public void addLeftPanel()
	{
		leftPanel.setLayout(new BorderLayout());

		JLabel epson = new JLabel("Printer: Epson EPL-7000");

		leftPanel.add(epson,BorderLayout.NORTH);
		
		addBoxes();
		addPrintQuality();

		outer.add(leftPanel, BorderLayout.CENTER);
	}


	// Function Name: addBoxes
	//
	// Purpose:  add all the checkboxes and radio buttons
	//	     in center of window
	//
	// Known Bugs: 
	//		

	public void addBoxes()
	{
		JCheckBox image = new JCheckBox("Image");
		JCheckBox text = new JCheckBox("Text");
		JCheckBox code = new JCheckBox("Code");

		JRadioButton selection = new JRadioButton("Selection",false);
		JRadioButton all = new JRadioButton("All",true);
		JRadioButton applet = new JRadioButton("Applet",false);

		JPanel boxes = new JPanel();
		boxes.setLayout(new GridLayout(3,2,20,5));

		boxes.add(image);
		boxes.add(selection);
		boxes.add(text);
		boxes.add(all);
		boxes.add(code);
		boxes.add(applet);

		JPanel centeredBoxes = new JPanel();
		centeredBoxes.setLayout(new FlowLayout(FlowLayout.CENTER));
		centeredBoxes.add(boxes);

		leftPanel.add(centeredBoxes,BorderLayout.CENTER);
	}


	// Function Name: addPrintQuality
	//
	// Purpose: add JLabel, JComboBox JCheckBox of bottom left
	//	    hand side of window
	//
	// Known Bugs: 
	//		

	public void addPrintQuality()
	{
		String s[]={"High"};

		JLabel printQuality = new JLabel("Print Quality: ");
		JComboBox high = new JComboBox(s);
		JCheckBox printToFile = new JCheckBox("Print to File  ",false);

		JPanel pqPanel = new JPanel();
		pqPanel.setLayout(new FlowLayout());
		

		pqPanel.add(printQuality);
		pqPanel.add(high);
		pqPanel.add(printToFile);

		leftPanel.add(pqPanel,BorderLayout.SOUTH); 
	}
	

	// Function Name: addButtonPanel
	//
	// Purpose: this adds the four buttons for the right hand
	//	    side of the window
	//
	// Known Bugs: 
	//		


	public void addButtonPanel()
	{
		JButton ok = new JButton("Ok");
		JButton cancel = new JButton("Cancel");
		JButton setup = new JButton("Setup...");
		JButton help = new JButton("Help");

		JPanel buttons = new JPanel();
		buttons.setLayout(new GridLayout(4,1,5,5));
		
		buttons.add(ok); 
		buttons.add(cancel); 
		buttons.add(setup); 
		buttons.add(help);

		outer.add(buttons, BorderLayout.EAST); 
	}


	// Function Name: main
	//
	// Purpose: construct a Printer; add window listener
	//	     
	//
	// Known Bugs: 
	//		

	public static void main (String args[])
	{
		Printer app = new Printer();

		app.addWindowListener(
			new WindowAdapter(){
			public void windowClosing ( WindowEvent e)
				{
					System.exit(0);
				}
			}
		);
	
	}
}

Problem 13.7
============

// Program Name: Circle.java
//
// Purpose:  The application create a window with a button, textarea and
//	    circle. The textarea contains the circle's area, radius,
//	    diameter, and perimeter. The circle is drawn in its own panel.  
//	    Whenever the button is clicked the old circle is erased and 
//	    a new circle of random size <150 
//	    is drawn and the textarea is updated with its information. 
//
// Known Bugs:  None
//		
//


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.*;

public class Circle extends JFrame
{
	CirclePanel circlePanel = new CirclePanel();
	JTextArea circleProperties= new JTextArea(20,20);
	Container c;


	// Function Name: Circle
	//
	// Purpose: Constructor for a Circle application. 
	//	     It	adds the button, the textarea, and the CirclePanel
	//	     on which the circle is drawn. It also adds the
	//	     button listener
	//
	// Known Bugs: 
	//		

	public Circle()
	{
		super("Circle");
		

			
		c = getContentPane();
		c.setLayout(new BorderLayout());

		c.add(circlePanel, BorderLayout.WEST);


		circleProperties.setEditable(false);
		circleProperties.setText(circlePanel.toString());

		c.add(circleProperties, BorderLayout.CENTER);

		JButton circleButton = new JButton("New Circle");
		circleButton.addActionListener( new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					circlePanel.randomize();
					circleProperties.setText(
						circlePanel.toString());
					c.repaint();
				}
			}
		);
				
		c.add(circleButton, BorderLayout.SOUTH);

		setSize(400,220);
		show();

	}


	// Function Name: main
	//
	// Purpose: create a Circle JFrame and an associated WindowListener
	//	     
	//
	// Known Bugs: 
	//		


	public static void main (String args[])
	{
		Circle app = new Circle();

		app.addWindowListener(
			new WindowAdapter(){
			public void windowClosing ( WindowEvent e)
				{
					System.exit(0);
				}
			}
		);
	
	}
}

// Class Name: CirclePanel
//
// Purpose: a JPanel which has a Circle drawn on it of diameter
//	     given by its diameter variable
//
// Known Bugs: 
//		
//

class CirclePanel extends JPanel
{
	double diameter; // holds current circle diameter


	// Function Name: CirclePanel
	//
	// Purpose: set the background color of the CirclePanel
	//	     give a random initial value <150 to the diameter
	//
	// Known Bugs: 
	//		

	public CirclePanel()
	{
		super();

		setBackground(Color.black);
		
		randomize();
	}


	// Function Name: randomize
	//
	// Purpose: Sets the diameter or circle to be a random 
	//	     value between 0 and 150
	//
	// Known Bugs: 
	//		

	public void randomize()
	{ 
		diameter = Math.random()*150;
	}


	// Function Name: paintComponent
	//
	// Purpose: draws the circle on the CirclePanel 
	//	    according to the size held in diameter 
	//
	// Known Bugs: 
	//		

	public void paintComponent(Graphics g)
	{
		int top,bot;

		super.paintComponent(g);

		g.setColor(Color.red);

		top = (175-(int)diameter)/2;
		bot = (int)diameter;

		g.fillOval(top,top,bot,bot);
	}


	// Function Name: getPreferredSize
	//
	// Purpose: returns the preffered drawing size of a
	//	     CirclePanel object
	//
	// Known Bugs: 
	//		


	public Dimension getPreferredSize()
	{
		return new Dimension( 175, 175);
	}


	// Function Name: toString
	//
	// Purpose: returns a string containing information about
	//	     the area, radius, diameter, and circumference
	//		of the circle on the CirclePanel
	//
	// Known Bugs: 
	//		


	public String toString()
	{
		DecimalFormat twoDigits = new DecimalFormat( "0.00");

		double area = Math.PI*diameter*diameter/4,
		       radius = diameter/2,
		       circum = Math.PI*diameter;		       

		String s = "  Circle Properties\n"+
			   "  =================\n\n\n"+
			   "  area = "+twoDigits.format(area)+"\n\n"+
			   "  radius = "+twoDigits.format(radius)+"\n\n"+
			   "  diameter = "+twoDigits.format(diameter)+"\n\n"+
			   "  circumference = "+twoDigits.format(circum)+"\n";
		return s;
	}
}


Problem 13.13
=============

// Program Name: MyColorChooser.java
//
// Purpose: A MyColorChooser is a JPanel with three Sliders and three
//		TextFields on it. The Sliders correspond to three color
//		red, green, blue. Adjusting the sliders changes the value in
//		the associated textfield, also it changes the color
//		returned by the MyColorChoosers getColor method. Finally,
//		changing a slider causes the container held in the vairable
//		c and passed to the MyColorChooser in its constructor to be
//		repainted.
//
// Known Bugs: 
//		
//

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class MyColorChooser extends JPanel
{
	Container c;
	JSlider redSlider, greenSlider, blueSlider;
	JTextField redField, greenField, blueField;


	// Function Name: MyColorChooser
	//
	// Purpose: Constructs a MyColorChooser JPanel.
	//	Sets up the three color sliders and their
	//	associated textfields. 
	//	Set the Container c to be the Container passed  
	//	to the constructor. 
	//
	// Known Bugs: 
	//		


	public MyColorChooser(Container contents)
	{
		super();

		c=contents;

		setBackground(Color.gray);
		setLayout(new GridLayout(3,2,15,5));

		redField = new JTextField(3);
		redSlider = new JSlider( SwingConstants.HORIZONTAL,0,255,125);
		setUpSliderField(redSlider,redField,Color.red);

		greenField = new JTextField(3);
		greenSlider = new JSlider(SwingConstants.HORIZONTAL,0,255,125);
		setUpSliderField(greenSlider,greenField,Color.green);
		
		blueField = new JTextField(3);
 		blueSlider = new JSlider(SwingConstants.HORIZONTAL,0,255,125); 
		setUpSliderField(blueSlider,blueField,Color.blue);
	
	}


	// Function Name: setUpSliderField
	//
	// Purpose: initialize a slider, initialize it background color
	//	     and its associated textfield
	//
	// Known Bugs: 
	//		


	void setUpSliderField(JSlider s, JTextField f, Color color)
	{
		f.setEditable(false);
		f.setText("125");

		s.setBackground(color);
		s.setMajorTickSpacing(20);
		s.setPaintTicks(true);
		s.addChangeListener(
			new SlideListener(s, f ) );

		add(s);
		add(f);
	}


	// Function Name: getPreferredSized
	//
	// Purpose: returns the preferred dimension for drawing something 
	//	    of type MyColorChooser
	//
	// Known Bugs: 
	//		


	public Dimension getPreferredSize()
	{
		return new Dimension( 200, 150);
	}


	// Function Name: getColor
	//
	// Purpose: returns the color corresponding to the current slider
	//	     values
	//
	// Known Bugs: 
	//		


	public Color getColor()
	{
		return new Color(redSlider.getValue(),
				greenSlider.getValue(), blueSlider.getValue());
 	}


	// Inner Class Name: SlideListener 
	//
	// Purpose: Used to handle stateChanged events for our three Sliders
	//	     
	//
	// Known Bugs: 
	//		


	class SlideListener implements ChangeListener
	{
		JSlider s;
		JTextField f;


		// Function Name: SlideListener
		//
		// Purpose: Constructor gets a copy of the slider
		//	    object and textfield it needs to handle
		//
		// Known Bugs: 
		//		

		public SlideListener(JSlider slider, JTextField field)
		{
			s=slider;
			f=field;
		}


		// Function Name: stateChanged
		//
		// Purpose: Repaint the Container the MyColorChooser lives on
		//	    and set the text to be the current slider value
		//
		// Known Bugs: 
		//		

		public void stateChanged(ChangeEvent e)
		{
			f.setText(""+s.getValue());
			c.repaint();			
		}
	}
}

// Program Name: MyColorTest.java
//
// Purpose: This file creates a JFrame that allow the user to
//	    manipulate three siders to set the Color of a rectangle
//	    TextFields are also used to display current RGB value
//
// Known Bugs: 
//		
//

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyColorTest extends JFrame
{

	Container c;
	MyColorChooser m;
	ColoredRectangle cr=new ColoredRectangle();


	// Function Name: MyColorTest
	//
	// Purpose: Constructor for MyColorTest, sets the layout
	//	    and adds a MyColorChooser object and a ColorRectangle
	//	    object to the JFrame
	//
	// Known Bugs: 
	//		


	public MyColorTest()
	{
		super("MyColorChooserTest");
		
		c=getContentPane();
		c.setLayout(new BorderLayout());
		
		m = new MyColorChooser(c);
		c.add(m, BorderLayout.CENTER);
		c.add(cr, BorderLayout.EAST); 

		setSize(400,150);
		show();

	}



	// Function Name: main
	//
	// Purpose: creates instance of MyColorTest adds a window
	//	    closing listener
	//	     
	//
	// Known Bugs: 
	//		

	public static void main (String args[])
	{
		MyColorTest app = new MyColorChooserTest();

		app.addWindowListener(
			new WindowAdapter(){
			public void windowClosing ( WindowEvent e)
				{
					System.exit(0);
				}
			}
		);
	
	}


// Inner Class Name: ColoredRectangle
//
// Purpose: JPanel on which a rectangle is drawn. Is used by
//	    MyColorTest to give the example color for the current
//	    slider settings. 
//
// Known Bugs: 
//		


class ColoredRectangle extends JPanel
{

	// Function Name: ColoredRectangle
	//
	// Purpose: Set the background colour of this component to white
	//	     
	//
	// Known Bugs: 
	//		

	public ColoredRectangle()
	{
		super();
		setBackground(Color.white);
	}


	// Function Name: paintComponent
	//
	// Purpose: fills the rectangle according to the color
	//	    given by the sliders in m.
	//	     
	//
	// Known Bugs: 
	//		

	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);

		g.setColor(m.getColor());

		g.fillRect(15,15,100,100);
	}


	// Function Name: getPreferredSize
	//
	// Purpose: returns the preferred size for drawing a ColorRectangle
 	//          object	     
	//
	// Known Bugs: 
	//		

	public Dimension getPreferredSize()
	{
		return new Dimension(130,130);
	}
} //end ColoredRectangle

} //end MyColorTest