Hello,

I'm working on a Moving Ball project and on the moving ball there are random number so i need to use the keyboard or the mouse to click on the number printed on the moving but i dont know how to go about it. here is the code below:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package basics;

/**
 *
 * @author michaeladedeji
 */
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Formatter;
import javax.swing.*;
import java.io.File;
import javax.sound.sampled.*;

import helpers.GlobalProperties;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
//private Color ballColor = null;


public class MovingLeftRight extends JPanel implements KeyListener,MouseListener {
    private static final int BOX_WIDTH = 640;
    private static final int BOX_HEIGHT = 480;
    private static final int RATE = 60;
    private File soundFile = new File("resources/snd16.wav");
    private File soundFile2 = new File("resources/soundwrong.wav");
    private Clip clip,clip2;
    private float ballRadius = 50;
    private float ballX = 360 - ballRadius;
    private float ballY = 290 - ballRadius;
    private float ballSpeedX = 6;
    private float ballSpeedY = 6;
    //Random number
    private int randomNumber=0;


    private boolean randomColorMode = false;
    private Color ballColor = null, numberColor = null;
    private Color backgroundColor;
    private static final float N = 64;
    private final Queue<Color> clut = new LinkedList<Color>();
    //Timer timer2 = new Timer(3*1000);
    Timer timer2;


    JMenuBar menubar = new JMenuBar();
    JMenu menu = new JMenu("menu");
    public MovingLeftRight() {

    JMenu speed = new JMenu("speed");
    JMenu size = new JMenu("Size");
    menu.add(speed);
    menu.add(size);
    JMenuItem big = new JMenuItem("Big");
    JMenuItem small = new JMenuItem("small");
    JMenuItem middium = new JMenuItem("Medium");

    JMenuItem fast = new JMenuItem("Fast");
    JMenuItem normal = new JMenuItem("Normal");
    JMenuItem slow = new JMenuItem("Slow");

    speed.add(fast);
    speed.add(normal);
    speed.add(slow);

    size.add(big);
    size.add(small);
    size.add(middium);
    menubar.add(menu);
    this.addKeyListener(this);


        this.setPreferredSize(new Dimension(BOX_WIDTH, BOX_HEIGHT));
        // Prepare a Clip

        try {
            AudioInputStream audioInputStream =
                AudioSystem.getAudioInputStream(soundFile);
            AudioInputStream audioInputStream2 =
                AudioSystem.getAudioInputStream(soundFile2);
            AudioFormat audioFormat = audioInputStream.getFormat();
            AudioFormat audioFormat2 = audioInputStream2.getFormat();
            DataLine.Info dataLineInfo =
                new DataLine.Info(Clip.class, audioFormat);
            DataLine.Info dataLineInfo2 =
                new DataLine.Info(Clip.class, audioFormat2);
            clip = (Clip) AudioSystem.getLine(dataLineInfo);
            clip2 = (Clip) AudioSystem.getLine(dataLineInfo2);
            clip.open(audioInputStream);
            clip2.open(audioInputStream2);
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }
        Timer timer = new Timer(1000 / RATE, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ballX += ballSpeedX;
                ballY += ballSpeedY;
                if (ballX - ballRadius < 0) {
                    ballSpeedX = -ballSpeedX;
                    ballX = ballRadius;
                    playSound();
                    //getParameters();
                } else if (ballX + ballRadius > BOX_WIDTH) {
                    ballSpeedX = -ballSpeedX;
                    ballX = BOX_WIDTH - ballRadius;
                    //playSound2();
                    //getParameters();
                }
                if (ballY - ballRadius < 0) {
                  ballSpeedY = -ballSpeedY;
                  ballY = ballRadius ;
                  //playSound2();
               } else if (ballY + ballRadius > BOX_HEIGHT) {
                  ballSpeedY = -ballSpeedY;
                  ballY = BOX_HEIGHT - ballRadius;
               }

                repaint();

            }
        });
        //timer.start();


        Timer timer2 = new Timer(4000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
               randomNumber=(int) Math.round(Math.random()*9);


            }
        });
        timer2.start();



        fast.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {


            ballSpeedX = 9;
            ballSpeedY = 9;
            //repaint();



        }
      });
       slow.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {

             ballSpeedX = 3;
             ballSpeedY = 3;

          }
        });
       normal.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {

           ballSpeedX =  5;
           ballSpeedY = 5;



        }
      });
       big.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {

            /*if(Selection.equals("Big")){
             */
              ballRadius = 50;



          }
        });
       small.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {

          /*if(Selection.equals("Big")){
           */
            ballRadius = 10;



        }
      });

       middium.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {

          /*if(Selection.equals("Big")){
           */
            ballRadius = 30;



        }
      });
      timer.start();



    }



    // Play the sound in a separate thread.
    private void playSound() {
        Runnable soundPlayer = new Runnable() {
            @Override
            public void run() {
                try {
                    clip.setMicrosecondPosition(0);
                    clip.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        new Thread(soundPlayer).start();
    }
    private void playSound2() {
        Runnable soundPlayer2 = new Runnable() {
            @Override
            public void run() {
                try {
                    clip2.setMicrosecondPosition(0);
                    clip2.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        new Thread(soundPlayer2).start();
    }



    @Override
    public void paintComponent(Graphics g) {
       // for (int i = 0; i < N; i++) {
    //clut.add(Color.getHSBColor(i / N, 1, 1));

             //   }

        super.paintComponent(g); // Paint background
        //getColors();

        g.setColor(Color.BLACK);
        g.fillRect(0, 0, BOX_WIDTH, BOX_HEIGHT);
        g.setColor(Color.BLUE);
        //clut.add(clut.remove());
        g.fillOval(
            (int) (ballX - ballRadius),
            (int) (ballY - ballRadius),
            (int) (2 * ballRadius), (int) (2 * ballRadius));
        g.setColor(Color.WHITE);


        int fontSize = (int) ballRadius;
        Font font = new Font("Arial", Font.PLAIN, fontSize);
        g.setFont(font);


        g.drawString(
                    ("" + randomNumber)
                , (int) (ballX-ballRadius/3)
                ,(int) (ballY+ballRadius/3));

        g.setFont(new Font("Dialog", Font.PLAIN, 12));
        StringBuilder sb = new StringBuilder();
        Formatter formatter = new Formatter(sb);
        formatter.format(
            "Ball @(%3.0f, %3.0f) Speed=(%2.0f, %2.0f)", ballX, ballY, ballSpeedX,
            ballSpeedY);
        g.drawString(sb.toString(), 20, 30);
    }
    public void keyPressed(KeyEvent e) {
		int keyCode = e.getKeyCode();
		if(keyCode == KeyEvent.VK_1){
                    System.out.printf("Correct!");
		}else{
			//mess="Pressed : "+KeyEvent.getKeyText(keyCode);
			e.consume();

		}


	}
	public void keyReleased(KeyEvent e) {


	}
	public void keyTyped(KeyEvent e) {

	}
        public void mouseClicked(MouseEvent arg0) {
	}
	public void mouseEntered(MouseEvent arg0) {}
	public void mouseExited(MouseEvent arg0) {
	}
	public void mousePressed(MouseEvent e) {
		//mess="you pressed down the mouse";

	}
	public void mouseReleased(MouseEvent arg0) {
		//mess="you released the mouse";

	}
    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override

            public void run() {
                MovingLeftRight Ani = new MovingLeftRight();
                JFrame frame = new JFrame("A Moving Ball");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                //frame.setContentPane(new AnimationSound());

                frame.add(Ani);
                frame.setJMenuBar(Ani.menubar);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

}
Comments
for real question and nice idea

i need to use the keyboard or the mouse to click on the number printed on the moving

Please explain what you are supposed to do.

There are some certain number printed on the moving ball. so, am to use the keyboard or mouse to match the number printed on the ball. if the number is not type from the keyboard does not match, it will make an error sound but if its matches then correct will be printed on the bottom of the frame then the next number will be printed on the ball and so on.

I'm not sure how the mouse will select a number to be tested.

Does the keylistener work? Does the component with the keylistener have focus?
Is it able to get focus?

Is there a way i can attach the snapshot of the app so you can understand better. The thing is am looking for a way to implement the keylistener in the moving ball app. The app is to test how effective someone eye is, so there is a random number on the moving ball all the user needs to do is to press whatever he/she see on the screen on the keyboard to match.

I think I understand part of what you are trying to do. I don't understand how you want to use the mouse.

Did you consider what I asked in my last post:
1)Does the keylistener work? Add a println in the listener to show if it is called and to show the contents of the KeyEvent object.

2)Does the component with the keylistener have focus?
3)Is it able to get focus?

when i use prints statement its doesnt because i was trying to implement VK_1 to test if it will work if 1 is show on the ball but it doesnt. pls explain more number 2 question for me. Focus in what sense?

when i use prints statement its doesnt

If nothing prints in the listener then the listener is not being called.

For information on focus, go to the API doc for the Component class. There is a paragraph near the bottom of the first part of the doc that talks about focus and has links to other sites in the doc and tutorials with lots of information.
http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/
Go to the above, find Component in the lower left frame and click on Component.

Edited 4 Years Ago by NormR1: n/a

This question has already been answered. Start a new discussion instead.