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);
}
});
}
}