Using Multiple ActionListeners in Java Swing
My problem is that at the moment I am making a GUI for a game and this GUI has many buttons. I had a problem earlier in my code where the actionListener
I was using was looking for events in two buttons in rapid succession, not giving enough time for the second button to perform and action and rendering it useless. I thought I overcame that by making the second button a different actionListener
in an inner class
button5.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
and now I'm trying to do the same for a third (and eventually fourth and fifth button
P1Roll.addActionListener(new ActionListener(){
public void ActionPerformed(ActionEvent e){
but it is throwing me all kinds of errors. As I am very new to swing, I am unsure how to proceed. Any tips on this, or anything in my code at all would be very much appreciated. :)
import java.awt.Font;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.Border;
public class GUI_Windows extends JFrame implements ActionListener {
public static void main(String[] args) {
new GUI_Windows();
Random rand1, rand2, rand3, rand4;
int dice1, dice2, dice3, dice4;
int numTurns = Turns.getValue();
rand1 = new Random();
rand2 = new Random();
rand3 = new Random();
rand4 = new Random();
dice1 = rand1.nextInt(6 - 1 + 1) + 1;
dice2 = rand2.nextInt(6 - 1 + 1) + 1;
dice3 = rand3.nextInt(6 - 1 + 1) + 1;
dice4 = rand4.nextInt(6 - 1 + 1) + 1;
}
Box MegaBox, box1, box2, box3, box4, box5, box6, box7, box8, box9, box10,
box11;
Box Minibox1, Minibox2, Minibox3, Minibox4, Minibox5, MiniMegaBox;
Box MegaBox2, box12, box13, box14, box15, box16, box17, box18, box19,
box20, box21, box22, box23;
JLabel TitleLabel, InstructionLabel, Instructions, SelectMode, LoG;
Border spacer1 = BorderFactory.createEmptyBorder(5, 5, 50, 5);
Border spacer2 = BorderFactory.createEmptyBorder(5, 60, 5, 0);
Border spacer3 = BorderFactory.createEmptyBorder(5, 0, 5, 60);
Border spacer4 = BorderFactory.createEmptyBorder(0, 0, 5, 45);
Border spacer5 = BorderFactory.createEmptyBorder(0, 0, 6, 0);
Border spacer6 = BorderFactory.createEmptyBorder(5, 10, 0, 70);
Border spacer7 = BorderFactory.createEmptyBorder(0, 0, 0, 35);
JRadioButton button1, button2;
JButton button3, button4;
JButton button5, button6;
static JSlider Turns;
public GUI_Windows() {
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
button3.doClick();
}
});
this.setTitle("Bottom Out!");
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.setResizable(false);
this.setLocation(500, 125);
this.setSize(350, 421);
MegaBox = Box.createVerticalBox();
box1 = Box.createVerticalBox();
box1.setBorder(spacer1);
box2 = Box.createVerticalBox();
box2.setBorder(spacer2);
box3 = Box.createHorizontalBox();
box4 = Box.createHorizontalBox();
box4.setBorder(spacer3);
box5 = Box.createVerticalBox();
box5.setBorder(spacer5);
box6 = Box.createHorizontalBox();
box7 = Box.createHorizontalBox();
box8 = Box.createHorizontalBox();
box9 = Box.createHorizontalBox();
box10 = Box.createHorizontalBox();
box10.setBorder(spacer7);
box11 = Box.createHorizontalBox();
box11.setBorder(spacer6);
button1 = new JRadioButton();
button1.addActionListener(this);
button2 = new JRadioButton();
button2.addActionListener(this);
TitleLabel = new JLabel("BOTTOM OUT");
TitleLabel.setFont(new Font("Times New Roman", Font.BOLD, 20));
TitleLabel.setAlignmentY(1);
InstructionLabel = new JLabel("Instructions:");
InstructionLabel.setAlignmentY(0);
InstructionLabel.setFont(new Font("Arial", Font.BOLD, 15));
Instructions = new JLabel();
Instructions.setAlignmentY(0);
Instructions
.setText("<HTML>Each game will be 3 - 20 turns, with either One Player versus the Computer, or Two Players "
+ "versus each other. Each turn, you will roll two die, and then the two die are totaled up, and "
+ "multiplied by the number of the roll it is for that turn. If this total is equal to, or higher than the "
+ "total of your last scores in that turn, than you add those points to your score for that turn. Then you "
+ "may choose to roll again, or end your turn to lock in your points for that turn.</HTML>");
SelectMode = new JLabel("Select Mode:");
SelectMode.setFont(new Font("Arial", Font.BOLD, 15));
LoG = new JLabel("Select number of Turns:");
Turns = new JSlider(2, 20, 2);
Turns.setMajorTickSpacing(2);
Turns.setMinorTickSpacing(1);
Turns.setPaintTicks(true);
Turns.setPaintLabels(true);
Turns.setSnapToTicks(true);
button3 = new JButton("Quit");
button3.setVisible(true);
button3.addActionListener(this);
button4 = new JButton("Next");
button4.setVisible(true);
button4.addActionListener(this);
button5 = new JButton("Done");
button5.setVisible(true);
// button5.addActionListener(this);
button6 = new JButton("Done");
button6.setVisible(true);
button6.addActionListener(this);
ButtonGroup group1 = new ButtonGroup();
group1.add(button1);
group1.add(button2);
ButtonGroup group2 = new ButtonGroup();
group2.add(button3);
group2.add(button4);
box6.add(TitleLabel);
box7.add(InstructionLabel);
box7.add(Box.createHorizontalGlue());
box7.add(new JLabel(" "));
box8.add(Instructions);
box3.add(SelectMode);
box3.add(Box.createHorizontalGlue());
box3.add(new JLabel(" "));
box4.add(button1);
box4.add(new JLabel(" One Player"));
box4.add(Box.createHorizontalGlue());
box4.add(button2);
box4.add(new JLabel(" Two Players"));
box9.add(LoG);
box9.setBorder(spacer4);
box10.add(Turns);
box10.add(Box.createHorizontalGlue());
box10.add(new JLabel(" "));
box11.add(button3);
box11.add(Box.createHorizontalGlue());
box11.add(button4);
box1.add(box6);
box1.add(box7);
box1.add(box8);
box5.add(box3);
box5.add(box4);
box2.add(box5);
box2.add(box9);
box2.add(box10);
box2.add(box11);
MegaBox.add(box1);
MegaBox.add(box2);
this.add(MegaBox);
this.setVisible(true);
}
int onePlayer = 0;
int isDone = 0;
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button3) {
System.exit(0);
}
if (button1.isSelected()) {
onePlayer = 1;
} else if (button2.isSelected()) {
onePlayer = 2;
}
if (e.getSource() == button4 && onePlayer == 0) {
JOptionPane.showMessageDialog(button1,
"You must select the number of players!", "Try again!",
JOptionPane.WARNING_MESSAGE);
} else if (e.getSource() == button4 && onePlayer != 0) {
final JFrame pFrame = new JFrame();
pFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pFrame.setTitle("Bottom Out!");
pFrame.setResizable(false);
pFrame.setLocation(500, 125);
pFrame.setSize(250, 200);
JLabel EnterName1, EnterName2;
final JTextField NameBox1;
final JTextField NameBox2;
Border border1 = BorderFactory.createEmptyBorder(5, 25, 15, 25);
Border border2 = BorderFactory.createEmptyBorder(15, 25, 5, 25);
Border border3 = BorderFactory.createEmptyBorder(5, 0, 5, 0);
EnterName1 = new JLabel("Player 1, please enter your name:");
EnterName2 = new JLabel("Player 2, please enter your name:");
NameBox1 = new JTextField("Miller");
NameBox2 = new JTextField("Julian");
if (onePlayer == 1) {
NameBox2.setEditable(false);
NameBox2.setText("Watson");
}
Minibox1 = Box.createVerticalBox();
Minibox2 = Box.createVerticalBox();
Minibox3 = Box.createVerticalBox();
Minibox4 = Box.createHorizontalBox();
MiniMegaBox = Box.createVerticalBox();
Minibox1.add(EnterName1);
Minibox1.add(NameBox1);
Minibox1.setBorder(border1);
Minibox2.add(EnterName2);
Minibox2.add(NameBox2);
Minibox2.setBorder(border2);
Minibox3.add(Minibox1);
Minibox3.add(Minibox2);
Minibox4.add(new JLabel(" "));
Minibox4.add(Box.createHorizontalGlue());
Minibox4.add(button5);
Minibox4.add(Box.createHorizontalGlue());
Minibox4.add(new JLabel(" "));
Minibox4.setBorder(border3);
MiniMegaBox.add(Minibox3);
MiniMegaBox.add(Minibox4);
pFrame.add(MiniMegaBox);
pFrame.setVisible(true);
this.setVisible(false);
button5.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button5) {
Border spaceBorder1 = BorderFactory.createEmptyBorder(
45, 45, 15, 45);
Border spaceBorder2 = BorderFactory.createEmptyBorder(
15, 45, 30, 45);
Border spaceBorder3 = BorderFactory.createEmptyBorder(
5, 15, 5, 0);
Border spaceBorder4 = BorderFactory.createEmptyBorder(
5, 0, 10, 10);
Border spaceborder5 = BorderFactory.createEmptyBorder(
0, 0, 15, 0);
Border spaceborder6 = BorderFactory.createEmptyBorder(
15, 0, 0, 0);
JFrame gFrame = new JFrame();
gFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gFrame.setTitle("Bottom Out!");
gFrame.setResizable(false);
gFrame.setLocation(500, 125);
gFrame.setSize(350, 421);
TitleLabel = new JLabel("BOTTOM OUT");
TitleLabel.setFont(new Font("Times New Roman",
Font.BOLD, 20));
TitleLabel.setAlignmentY(1);
box23 = Box.createHorizontalBox();
box23.add(TitleLabel);
box23.setBorder(spaceborder6);
box12 = Box.createHorizontalBox();
box12.setBorder(spaceBorder1);
box13 = Box.createHorizontalBox();
box13.setBorder(spaceBorder2);
box14 = Box.createHorizontalBox();
box14.setBorder(spaceborder5);
box15 = Box.createVerticalBox();
box16 = Box.createHorizontalBox();
box16.setBorder(spaceBorder3);
box17 = Box.createHorizontalBox();
box17.setBorder(spaceBorder3);
box18 = Box.createHorizontalBox();
box18.setBorder(spaceBorder3);
box19 = Box.createHorizontalBox();
box19.setBorder(spaceBorder3);
box20 = Box.createHorizontalBox();
box20.setBorder(spaceBorder3);
box21 = Box.createHorizontalBox();
box21.setBorder(spaceBorder4);
box22 = Box.createVerticalBox();
MegaBox2 = Box.createVerticalBox();
JLabel Player1, Player2, P1Score, P2Score;
JButton P1Roll, P2Roll, EndTurn;
JLabel TurnNum, TurnMax, TurnsRem, P1TScore, P2TScore, Winner;
Player1 = new JLabel(NameBox1.getText() + ":");
P1Score = new JLabel("Score");
P1Roll = new JButton("Roll!");
Player2 = new JLabel(NameBox2.getText() + ":");
P2Score = new JLabel("Score");
P2Roll = new JButton("Roll!");
EndTurn = new JButton("End Turn");
TurnNum = new JLabel("Turn Number: ");
TurnMax = new JLabel("Turn max: ");
TurnsRem = new JLabel("Turns left: ");
P1TScore = new JLabel("Player 1 Score: ");
P2TScore = new JLabel("Player 2 Score: ");
Winner = new JLabel("Player is Winning");
box12.add(Player1);
box12.add(Box.createHorizontalGlue());
box12.add(P1Score);
box12.add(Box.createHorizontalGlue());
box12.add(P1Roll);
box13.add(Player2);
box13.add(Box.createHorizontalGlue());
box13.add(P2Score);
box13.add(Box.createHorizontalGlue());
box13.add(P2Roll);
box14.add(new JLabel("开发者_运维百科 "));
box14.add(Box.createHorizontalGlue());
box14.add(EndTurn);
box14.add(Box.createHorizontalGlue());
box14.add(new JLabel(" "));
box15.add(box23);
box15.add(box12);
box15.add(box13);
box15.add(box14);
box16.add(TurnNum);
box16.add(Box.createHorizontalGlue());
box16.add(new JLabel(" "));
box17.add(TurnMax);
box17.add(Box.createHorizontalGlue());
box17.add(new JLabel(" "));
box18.add(TurnsRem);
box18.add(Box.createHorizontalGlue());
box18.add(new JLabel(" "));
box19.add(P1TScore);
box19.add(Box.createHorizontalGlue());
box19.add(new JLabel(" "));
box20.add(P2TScore);
box20.add(Box.createHorizontalGlue());
box20.add(new JLabel(" "));
box21.add(new JLabel(" "));
box21.add(Box.createHorizontalGlue());
box21.add(Winner);
box22.add(box16);
box22.add(box17);
box22.add(box18);
box22.add(box19);
box22.add(box20);
box22.add(box21);
MegaBox2.add(box15);
MegaBox2.add(box22);
gFrame.add(MegaBox2);
gFrame.setVisible(true);
pFrame.setVisible(false);
P1Roll.addActionListener(new ActionListener(){ public void ActionPerformed(ActionEvent e){
}
@Override
public void actionPerformed(ActionEvent e) {
int turnNum;
for(turnNum; numTurns > 0 ; numTurns -- ){
}
}});
}
}
});
}
}}
From an initial reading of the code, it appears you're creating the anonymous ActionListener with incorrect syntax.
P1Roll.addActionListener(new ActionListener(){ public void ActionPerformed(ActionEvent e){
}
@Override
public void actionPerformed(ActionEvent e) {
int turnNum;
for(turnNum; numTurns > 0 ; numTurns -- ){
}
}});
Should be
P1Roll.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e)
{
int turnNum;
for(turnNum; numTurns > 0 ; numTurns -- )
{
}
});
精彩评论