|
This simple program rolls two dice. It is divided into three source files.
|
RollDice.java - the main program / applet1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// File: roll_dice2/RollDicePanel.java
// Description: Main program and applet display two dice and roll them.
// Author: Fred Swartz
// Date: 2005-01-29
package roll_dice2;
import java.awt.*;
import javax.swing.*;
///////////////////////////////////////////////////////// class RollDice
/** RollDice.java -- Program to display two dice and roll them.
* @author Fred Swartz
* @version 2005-01-29
* This can run as an application because it has a main method.
* It can also be used as an applet because it extends JApplet.
* Use the following for an applet tag. <br>
* <applet code="roll_dice2.RollDice.class" archive="roll_dice2.jar"
* width="130" height="107"></appletgt;
*/
public class RollDice extends JApplet {
//=============================================== applet constructor
/** Applet constructor requires putting the panel in applet.*/
public RollDice() {
this.setContentPane(new RollDicePanel());
}
//====================================================== method main
/** Create JFrame and set content pane to a RollDicePanel. */
public static void main(String[] args) {
JFrame window = new JFrame("Dice Demo");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setContentPane(new RollDicePanel());
window.pack();
window.setVisible(true);
}//end main
}
|
RollDicePanel.java provides the GUI to this demo program1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
// File: roll_dice2/RollDicePanel.java
// Description: Panel of GUI, shows button and two dice.
// Author: Fred Swartz
// Date: 2005-01-29
package roll_dice2;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
///////////////////////////////////////////////////////// class RollDicePanel
/** RollDicePanel.java - Panel builds GUI for RollDice application/applet.
It subclasses JPanel to contain two dice and a button to roll them.
@author Fred Swartz
@version 2005-01-29
*/
public class RollDicePanel extends JPanel {
//=============================================== instance variables
private Die myLeftDie; // component for one die
private Die myRightDie;
//====================================================== constructor
/** Create border layout panel with one button and two dice. */
RollDicePanel() {
//... Create the dice
myLeftDie = new Die();
myRightDie = new Die();
//...Create the button to roll the dice
JButton rollButton = new JButton("New Roll");
rollButton.setFont(new Font("Sansserif", Font.PLAIN, 24));
//... Add listener.
rollButton.addActionListener(new RollListener());
//... Layout components
this.setLayout(new BorderLayout(5, 5));
this.add(rollButton, BorderLayout.NORTH);
this.add(myLeftDie , BorderLayout.WEST);
this.add(myRightDie, BorderLayout.EAST);
}//end constructor
/////////////////////////////////// inner listener class RollListener
/** Inner listener class for Roll button. */
private class RollListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
myLeftDie.roll();
myRightDie.roll();
}
}
}
|
Die.java implements the graphics and logic of a die1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
// File: roll_dice2/Die.java
// Description: Models / displays one die.
// Author: Fred Swartz
// Date: 2005-01-29
package roll_dice2;
import java.awt.*;
import javax.swing.*;
////////////////////////////////////////////////////////////// class Die
/** Die.java - Component to display one die (dice). This class
subclasses JPanel to display the face, and it provides functions
to "roll", giving different random values.
Possible improvements:
<ul>
<li>Use Graphics2 anti-aliasing to smooth the dot edges.</li>
<li>Add a border.</li>
</ul>
@author Fred Swartz
@version 2003-04-30
*/
public class Die extends JPanel {
//================================================ constant
private static final int SPOT_DIAMETER = 9; // Diameter of spots
//=============================================== instance variables
private int myFaceValue; // value that shows on face of die
//end instance variables
//====================================================== constructor
/** Initialize to white background and 60x60 pixels. Initial roll.*/
public Die() {
setBackground(Color.white);
//-- Preferred size is set, but layout may change it.
setPreferredSize(new Dimension(60,60));
roll(); // Set to random initial value
}//end constructor
//====================================================== method roll
/** Produce random roll in range 1-6. Causes repaint().
@return Result of roll (1-6).
*/
public int roll() {
int val = (int)(6*Math.random() + 1); // Range 1-6
setValue(val);
return val;
}//end roll
//================================================== method getValue
/** Returns result of last roll.*/
public int getValue() {
return myFaceValue;
}//end setValue
//================================================== method setValue
/** Sets the value of the Die. Causes repaint().
@param spots Number from 1-6.
*/
public void setValue(int spots) {
myFaceValue = spots;
repaint(); // Value has changed, must repaint
}//end setValue
//============================================ method paintComponent
/** Draws spots of die face. */
public void paintComponent(Graphics g) {
super.paintComponent(g); // Required
int w = getWidth(); // Panel height and width
int h = getHeight();
g.drawRect(0, 0, w-1, h-1); // Draw border
switch (myFaceValue) {
case 1: drawSpot(g, w/2, h/2);
break;
case 3: drawSpot(g, w/2, h/2);
// Fall thru to next case
case 2: drawSpot(g, w/4, h/4);
drawSpot(g, 3*w/4, 3*h/4);
break;
case 5: drawSpot(g, w/2, h/2);
// Fall thru to next case
case 4: drawSpot(g, w/4, h/4);
drawSpot(g, 3*w/4, 3*h/4);
drawSpot(g, 3*w/4, h/4);
drawSpot(g, w/4, 3*h/4);
break;
case 6: drawSpot(g, w/4, h/4);
drawSpot(g, 3*w/4, 3*h/4);
drawSpot(g, 3*w/4, h/4);
drawSpot(g, w/4, 3*h/4);
drawSpot(g, w/4, h/2);
drawSpot(g, 3*w/4, h/2);
break;
}
}//end paintComponent
/** Utility method used by paintComponent(). */
//================================================== method drawSpot
private void drawSpot(Graphics g, int x, int y) {
g.fillOval(x-SPOT_DIAMETER/2, y-SPOT_DIAMETER/2, SPOT_DIAMETER, SPOT_DIAMETER);
}
}
|