I am working on a moving object. so I created a menu bar for size and speed, the idea behind it is that each time small, big or medium is clicked it should change the size and same also applies to the speed but when implement the action listener its does not change any suggestion please?

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.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.border.BevelBorder;

import java.awt.geom.Ellipse2D;
import javax.sound.sampled.*;
public class second extends JPanel {
    private static final int BOX_WIDTH = 600;
    private static final int BOX_HEIGHT = 400;
    private static final int RATE = 30;
    private Ellipse2D circ;
    private File soundFile = new File("snd16.wav");
    private Clip clip;
    private Color numberColor = null;
    private float ballRadius = 30;
    private float ballX = 220 - ballRadius;
    private float ballY = 220 - ballRadius;
    private float ballSpeedX = 2;
    private float ballSpeedY = 2;
    
    JMenuBar menubar = new JMenuBar();
    JMenu menu = new JMenu("menu");
    public second() {
    	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);
    	//setJMenuBar(menubar);
    	setVisible(true);
      
        this.setPreferredSize(new Dimension(BOX_WIDTH, BOX_HEIGHT));
        // Prepare a Clip
        try {
            AudioInputStream audioInputStream =
                AudioSystem.getAudioInputStream(soundFile);
            AudioFormat audioFormat = audioInputStream.getFormat();
            DataLine.Info dataLineInfo =
                new DataLine.Info(Clip.class, audioFormat);
            clip = (Clip) AudioSystem.getLine(dataLineInfo);
            clip.open(audioInputStream);
        } 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();
                } else if (ballX + ballRadius > BOX_WIDTH) {
                    ballSpeedX = -ballSpeedX;
                    ballX = BOX_WIDTH - ballRadius;
                    playSound();
                }
                repaint();
            }
        });
        timer.start();
        //add(menu);
        fast.addActionListener(new ActionListener() {
  	      public void actionPerformed(ActionEvent event) {
  	        if(event.equals("Fast")){
  	        	if(ballSpeedX==2)
  	        		ballSpeedX += 10;
  	        	
  	        	
  	        }
  	      
  	      }
  	    });
        slow.addActionListener(new ActionListener() {
    	      public void actionPerformed(ActionEvent event) {
    	        if(event.equals("Slow")){
    	        	ballSpeedX = 3;
    	        	
    	        }
    	        //ballSpeedX = ballSpeedX + 3;
    	        //System.exit(0);
    	      }
    	    });
        normal.addActionListener(new ActionListener() {
  	      public void actionPerformed(ActionEvent event) {
  	        if(event.equals("Normal")){
  	        	ballSpeedX = ballSpeedX + 5;
  	        	
  	        }
  	      }
  	    });
        big.addActionListener(new ActionListener() {
    	      public void actionPerformed(ActionEvent event) {
    	    	  String Selection = event.getActionCommand();
    	        if(Selection.equals("Big")){
    	        	 ballRadius = 50;
    	        	if (ballX - ballRadius < 0) {
                        ballSpeedX = -ballSpeedX;
                        ballX = ballRadius;
                       
    	        	}
    	        	
    	        }
    	      }
    	    });
        
        
    }
   

    // 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();
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g); // Paint background
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, BOX_WIDTH, BOX_HEIGHT);
        g.setColor(Color.GREEN);
        g.fillOval(
            (int) (ballX - ballRadius),
            (int) (ballY - ballRadius),
            (int) (2 * ballRadius), (int) (2 * ballRadius));
        g.setColor(Color.WHITE);
        g.setFont(new Font("Dialog", Font.PLAIN, 12));
       
        
        StringBuilder sb = new StringBuilder();
        Formatter formatter = new Formatter(sb);
       formatter.format(
            "Ball @(%3.0f) Speed=(%2.0f)", ballX, ballSpeedX);
        g.drawString(sb.toString(), 20, 30);
        
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
            	second ex = new second();
            	//ex.pane.setBorder(new BevelBorder(BevelBorder.LOWERED));
                JFrame frame = new JFrame("A Moving Ball");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new second());
                frame.add(new second());
                frame.setJMenuBar(ex.menubar);
                frame.pack();
                frame.setVisible(true);

            }
        });
    }
}

Recommended Answers

All 7 Replies

if (event.equals("Fast")) etc
event is an ActionEvent , "Fast" is a String. They can never be equal.

But since each listener listens to events from just one menu item, you don't need that test anyway!

I dont understand what you mean by

But since each listener listens to events from just one menu item, you don't need that test anyway!

you know this application and also using sound to make a sound when ever its touches the edge of the left but when i clicked on fast instead of the object to move fast it makes a sound before it touches the edge and also when its touches the edge. so i was thinking maybe my if statement was wrong.

I dont understand what you mean by ...

//add(menu);
fast.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
      if(event.equals("Fast")){

This listener class is added to the "fast" button, and no other buttons. So when it is called the source can only be the fast button, so there's no need to test the source or the actionevent.

so what do you suggest that i use. because in line 118 i use

String Selection = event.getActionCommand();
    	        if(Selection.equals("Big")){
    	        	 ballRadius = 50;
    	        	if (ballX - ballRadius < 0) {
                        ballSpeedX = -ballSpeedX;
                        ballX = ballRadius;
 
    	        	}

but still it doesnt make it work either and instead if the size to change it makes sound.

Line 118 is in this context:

big.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent event) {
   String Selection = event.getActionCommand();

This code is only triggered by the big button, so there's no point testing

if(Selection.equals("Big")){

... even if you do code the if test correctly (see my earlier post)

I removed the

if(event.equals("fast"))

and yet it doesnt change the size of the object.

Now i understand what you mean so i have figured it out thanks

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.