// Scott DeRuiter 3/12/2003 // CompassTest.java // Use the left and right keys to move the hand of a compass. // 3/13/2013 Greenstein: changed applet to JFrame import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CompassTest implements KeyListener, FocusListener, MouseListener { Compass mycompass = new Compass ( 200, 120, 80, 0, Color.gray, Color.blue ); Compass myothercompass = new Compass ( 60, 300, 30, 90, Color.yellow, Color.magenta ); private JFrame frame; private DrawStuff canvas; public CompassTest ( ) { mycompass = new Compass ( 200, 120, 80, 0, Color.gray, Color.blue ); myothercompass = new Compass ( 60, 300, 30, 90, Color.yellow, Color.magenta ); } public static void main(String[] args) { CompassTest ct = new CompassTest(); ct.Run(); } public void Run ( ) { // Create a frame to hold everything frame = new JFrame ("Compass"); frame.setSize(500, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //frame.setBackground(Color.black); // only needed if frame is larger than panel // Define panel to draw on canvas = new DrawStuff(); // create a panel to draw on canvas.setBackground(Color.gray); canvas.addFocusListener(this); canvas.addKeyListener(this); canvas.addMouseListener(this); // connects the MouseListerner to the panel window // Put frame together frame.getContentPane().add(canvas); // puts panel on frame frame.setVisible(true); } class DrawStuff extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); mycompass.draw ( g ); myothercompass.draw ( g ); } } public void focusGained(FocusEvent evt) { canvas.repaint(); } public void focusLost(FocusEvent evt) { canvas.repaint(); } public void mousePressed(MouseEvent evt) { canvas.requestFocus(); } public void mouseEntered(MouseEvent evt) { } public void mouseExited(MouseEvent evt) { } public void mouseReleased(MouseEvent evt) { } public void mouseClicked(MouseEvent evt) { } public void keyTyped ( KeyEvent e ) {} public void keyPressed ( KeyEvent e ) { int value = e.getKeyCode(); if ( value == KeyEvent.VK_RIGHT ) { mycompass.changedegree ( 3 ); myothercompass.changedegree ( 9 ); canvas.repaint (); } else if ( value == KeyEvent.VK_LEFT ) { mycompass.changedegree ( -3 ); myothercompass.changedegree ( -9 ); canvas.repaint (); } } public void keyReleased ( KeyEvent e ) {} } class Compass { private int xpos, ypos, radius, degree; private Color face, arrow; public Compass ( int x, int y, int r, int d, Color f, Color a ) { xpos = x; ypos = y; radius = r; degree = d; face = f; arrow = a; } public void draw ( Graphics g ) { g.setColor ( face ); g.fillOval ( xpos - radius, ypos - radius, 2 * radius, 2 * radius ); g.setColor ( Color.black ); g.drawOval ( xpos - radius, ypos - radius, 2 * radius, 2 * radius ); g.drawLine ( xpos, ypos - radius, xpos, ypos + radius ); g.drawLine ( xpos - radius, ypos, xpos + radius, ypos ); g.drawLine ( xpos + 2 * radius / 3, ypos - 2 * radius / 3, xpos - 2 * radius / 3, ypos + 2 * radius / 3 ); g.drawLine ( xpos - 2 * radius / 3, ypos - 2 * radius / 3, xpos + 2 * radius / 3, ypos + 2 * radius / 3 ); drawarrow ( g ); g.setColor ( Color.black ); g.fillOval ( xpos - radius / 16, ypos - radius / 16, radius / 8, radius / 8 ); drawletters ( g ); } public void drawarrow ( Graphics g ) { int [] x = new int [7]; int [] y = new int [7]; double dx = Math.PI / 32; x[0] = (int) ( xpos + radius / 10 * Math.cos ( degree * Math.PI / 180 + 3 * Math.PI / 4 )); x[1] = (int) ( xpos + 4 * radius / 5 * Math.cos ( degree * Math.PI / 180 + dx )); x[2] = (int) ( xpos + 4 * radius / 5 * Math.cos ( degree * Math.PI / 180 + 2 * dx )); x[3] = (int) ( xpos + radius * Math.cos ( degree * Math.PI / 180 )); x[4] = (int) ( xpos + 4 * radius / 5 * Math.cos ( degree * Math.PI / 180 - 2 * dx )); x[5] = (int) ( xpos + 4 * radius / 5 * Math.cos ( degree * Math.PI / 180 - dx )); x[6] = (int) ( xpos + radius / 10 * Math.cos ( degree * Math.PI / 180 - 3 * Math.PI / 4 )); y[0] = (int) ( ypos + radius / 10 * Math.sin ( degree * Math.PI / 180 + 3 * Math.PI / 4 )); y[1] = (int) ( ypos + 4 * radius / 5 * Math.sin ( degree * Math.PI / 180 + dx )); y[2] = (int) ( ypos + 4 * radius / 5 * Math.sin ( degree * Math.PI / 180 + 2 * dx )); y[3] = (int) ( ypos + radius * Math.sin ( degree * Math.PI / 180 )); y[4] = (int) ( ypos + 4 * radius / 5 * Math.sin ( degree * Math.PI / 180 - 2 * dx )); y[5] = (int) ( ypos + 4 * radius / 5 * Math.sin ( degree * Math.PI / 180 - dx )); y[6] = (int) ( ypos + radius / 10 * Math.sin ( degree * Math.PI / 180 - 3 * Math.PI / 4 )); g.setColor ( arrow ); g.fillPolygon ( x, y, 7 ); } public void drawletters ( Graphics g ) { g.setColor ( Color.black ); Font letters = new Font("Serif", Font.BOLD, radius / 3); g.setFont(letters); g.drawString ( "N", xpos - radius / 12, ypos - radius - radius / 12 ); g.drawString ( "NE", xpos + 3 * radius / 4, ypos - 3 * radius / 4 ); g.drawString ( "E", xpos + radius + radius / 12, ypos + radius / 12 ); g.drawString ( "SE", xpos + 3 * radius / 4, ypos + radius ); g.drawString ( "S", xpos - radius / 12, ypos + radius + radius / 3 ); g.drawString ( "SW", xpos - 4 * radius / 3, ypos + radius ); g.drawString ( "W", xpos - radius - radius / 3, ypos + radius / 12 ); g.drawString ( "NW", xpos - 4 * radius / 3, ypos - 3 * radius / 4 ); } public void changedegree ( int addto ) { degree += addto; if ( degree >= 360 ) degree -= 360; else if ( degree <= 0 ) degree += 360; } }