Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

action listener in another class - java

it is possible to have two class, and in one something like

arrayButtons[i][j].addActionListener(actionListner);

and in another

ActionListener actionListner = new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            for (int j = 0; j < arrayButtons.length; j++) {
                for (int i = 0; i < arrayButtons[j].length; i++) {
                    if (arrayButtons[j][i] == e.getSource()) {

                        if ((gameNumber == 2) && (playHand.getNumberOfCards() == 0)) {
                            if (player[j].getCard(i).getSuit() == Suit.HEARTS.toString() && player[j].hasSuitBesideHearts())
                                //second game
                                messageOnTable("xxx");

                            else{
                                arrayButtons[j][i].setVisible(false);
                                test[j].setIcon(player[j].getCard(i).getImage());
                                pnCardNumber[j].setText(Integer.toString(player[j].getCard(i).getNumber()));
                                pnCardName[j].setText(player[j].getCard(i).toString());
                                pnCardSuit[j].setText(player[j].getCard(i).getSuit());

                                playHand.addCard(player[j].getCard(i), j);

                                player[j].removeCard(i);

                            }

                        }

}

//and more the reason of that is because i need to separate the button (swing) to the action listener

how i can do ?

thanks

like image 727
user455318 Avatar asked Feb 13 '11 17:02

user455318


2 Answers

Not only it is possible to separate these two, it's also recommended (see MVC pattern - it's very much about separating screen controls like buttons, and the logics of your program)

The easiest way that comes to my mind is to do write a named class that implements ActionListener interface, something like this:

public class SomeActionListener implements ActionListener{

    private JTextField textField1;
    private JComboBox combo1;
    private JTextField textField2;
    //...

    public SomeActionListener(JTextField textField1, JComboBox combo1, 
                                          JTextField textField2){
        this.textField1=textField1;
        this.combo1=combo1;
        this.textField2=textField2;
        //...
    }

    public void actionPerformed(ActionEvent e) {
        //cmd
    }

}

And then add it to your buttons:

ActionListener actionListener = new SomeActionListener(textField1, combo1, textField2);
someButton.addActionListener(actionListener);
like image 165
Goran Jovic Avatar answered Sep 19 '22 23:09

Goran Jovic


It's a bit off topic but you should definately not use the == operator to compare Strings as you appear to be doing on this line:

if (player[j].getCard(i).getSuit() == Suit.HEARTS.toString()

This is because Strings are pointers, not actual values, and you may get unexpected behaviour using the == operator. Use the someString.equals(otherString) method instead. And also

"String to compare".equals(stringVariable)

is alot better than the other way around

stringVariable.equals("String to compare to")

because in the first example you avoid getting a NullPointerException if stringVariable is null. It just returns false.

like image 29
Oskar Lund Avatar answered Sep 19 '22 23:09

Oskar Lund