Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I add an ActionListener to a JButton in a static instance?

Tags:

java

swing

Nothing I've been able to find anywhere is working, and the code seems to differ from how you would do it in an applet, which I'm used to. I'm new to swing. How can I add an ActionListener (is that it? Or am I looking for something else?) to my JButtons? (I'm not sure what is causing the code block to go all wonky like that, I can't fix it.)

`

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Main implements ActionListener{

static String answerOne = "";
static String answerTwo = "";
static boolean answerable = false;
static int labelX = 240, labelY = 48;
static int questionWrite = 0;
static String text = "Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. ";
static int charIndex = 0;

private static void createAndShowGUI() {
    JFrame frame = new JFrame("FrameDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JLabel emptyLabel = new JLabel("");
    emptyLabel.setPreferredSize(new Dimension(300, 225));
    frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

    frame.pack();
    frame.setVisible(true);

    frame.setLayout(null);
    frame.setResizable(false);

    JPanel buttons = new JPanel(new FlowLayout());
    final JButton buttonOne = new JButton(answerOne);
    final JButton buttonTwo = new JButton(answerTwo);
    final JButton buttonThree = new JButton("Continue");
    buttonThree.setActionCommand("continue");

    if (answerable == true) {
    buttons.add(buttonOne);
    buttons.add(buttonTwo);
    } else {
        buttons.add(buttonThree);
    }

    frame.add(buttons);

    final JLabel centerText = new JLabel("<html>");
    frame.add(centerText);

    buttons.reshape(50, 185, 200, 40);
    centerText.reshape(10, 10, 280, 160);

    Timer timer = new Timer(50, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        String labelText = centerText.getText();
        labelText += text.charAt(charIndex);
        centerText.setText(labelText);
        charIndex++;
        if (charIndex >= text.length()) {
            ((Timer)e.getSource()).stop();
        }

        Object buttonClicked = e.getSource();
        if(buttonClicked == buttonOne) {
            System.out.println("One.");
        }
        else if(buttonClicked == buttonTwo) {
            System.out.println("Two.");
        }
        else if(buttonClicked == buttonThree) {
            System.out.println("Continuing.");
        }

        //writeNext(Text to write, button one text, button two text, yes/no or "continue"); 
        switch(questionWrite) {
        case 0:
            writeNext("Welcome! I will ask simple, two-answer questions, and you will answer them. Simple as that. ", null, null, false);
            break;
        case 1:
            writeNext("Is Canada the largest country?", "Yes", "No,", true);
            break;
        case 2:
            writeNext("Have humans been to Mars?", "Yes", "No", true);
            break;
        }
    }

});

    timer.start();
}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });



}
public static void writeNext(String textM, String answerOneM, String answerTwoM, boolean answerableM) {
        text = textM;
        answerOne = answerOneM;
        answerTwo = answerTwoM;
        answerable = answerableM;
    }

@Override
public void actionPerformed(ActionEvent arg0) {

}

}`

like image 866
IHazABone Avatar asked Nov 26 '25 06:11

IHazABone


1 Answers

button.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        //action listener here
    }
});

Since you have to pass in an object to addActionListener, you can't do that from your static context. So you make an instance of an anonymous class and pass that in with your action event handler.

Alternatively, you can write the actionPerformed method in your class. It's probably best to give it a constructor to identify it though.

private int button;
public Main(int button)
{
    this.button = button;
}

Then to add the action listener:

button.addActionListener(new Main(1)); //or pass it 2, 3, 4 ... just some unique integer

Inside your actionPerformed you can read the integer you passed in.

if(this.button==1)
{
    //do button 1 stuff
}
like image 118
Cruncher Avatar answered Nov 28 '25 19:11

Cruncher