我想在单击按钮1时打印数字1,但它不起作用

时间:2017-08-30 12:59:31

标签: java swing jbutton actionlistener

这是使用Java制作tictactoe游戏的第一步。

我想在点击按钮1时打印1号。有9个按钮,但它不起作用我打印e.getsource方法和B1按钮时它们不相同。为什么会这样?

package tictactoe;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TicTacToe implements ActionListener{

JFrame frame1;
JButton B1 = new JButton();
JButton B2 = new JButton();
JButton B3 = new JButton();
JButton B4 = new JButton();
JButton B5 = new JButton();
JButton B6 = new JButton();
JButton B7 = new JButton();
JButton B8 = new JButton();
JButton B9 = new JButton();

public void createGui(){
    frame1 = new JFrame();
    frame1.setTitle("TicTacToe");
    frame1.setSize(600, 600);
    frame1.setLayout(new GridLayout(3,3,0,0));
    frame1.setLocationRelativeTo(null); 

    frame1.add(B1);
    frame1.add(B2);
    frame1.add(B3);
    frame1.add(B4);
    frame1.add(B5);
    frame1.add(B6);
    frame1.add(B7);
    frame1.add(B8);
    frame1.add(B9);

    TicTacToe A1 = new TicTacToe();

    B1.addActionListener(A1);
    B2.addActionListener(A1);
    B3.addActionListener(A1);
    B4.addActionListener(A1);
    B5.addActionListener(A1);
    B6.addActionListener(A1);
    B7.addActionListener(A1);
    B8.addActionListener(A1);
    B9.addActionListener(A1);

   // frame1.pack();
    frame1.setVisible(true);
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e) {
    if(e.getSource()==B1){
        B1.setText("1");
    }
}

public static void main(String[] args) {
    TicTacToe T1 = new TicTacToe();
    T1.createGui();
}
}

1 个答案:

答案 0 :(得分:2)

您编程的原因不起作用是您创建了一个新的TicTacToe,用作JButton.addActionListener()的参数。请尝试使用this,然后移除A1

B2.addActionListener(this);

然后它会起作用。

但是我建议采用与使用JButton.addActionListener()不同的方法。

相反,您可以使用JButton作为参数的Action构造函数。实现扩展Action的自己的AbstractAction,然后在需要实施的actionPerformed()方法中设置文本。 您可以让Action在按下时使用您要写入的文本的参数。

private class PressedAction extends AbstractAction {
    private final String text;

    public PressedAction(String text) {
        this.text = text;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        ((JButton) e.getSource()).setText(text);
    }
}