java - 需要帮助了解特定 setter/getter 如何影响我的程序

标签 java swing methods action getter

我对编码非常陌生(2个月),我尝试用java制作井字游戏。我有点不知所措,但我设法使用 swing 创建了它。我的主要问题是在 button1 类中。我本来打算使用 getText() 方法,但最终不需要它,或者我是这么想的。我尝试删除它,但事实证明,如果没有它,我的井字游戏按钮就不会切换字母。编译器告诉我它会覆盖 AbstractButtongetText() 方法,但我不明白为什么这很重要,因为我认为我从未真正使用过它。我认为这可能是一个范围问题,它被以某种方式覆盖,但我不确定。我试图使用 text 变量来使用 setText() 更新按钮,但这似乎并不像我想象的那样工作。我也不明白为什么 3 x 3 网格布局在大多数情况下似乎都能正常工作,但有时添加的按钮数量是错误的。

总而言之,程序可以工作(大部分),但我不完全理解 button1 类是如何工作的。

TicTacToe.java

import java.awt.*;
import java.util.*;
import javax.swing.*;

public class TicTacToe extends JFrame {

public static void main(String[] args) {
    JFrame window = new JFrame("Tic-Tac-Toe");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);
    window.setSize(600, 600);
    window.setLayout(new GridLayout(3, 3));

    ArrayList<button1> buttonArrayList = new ArrayList<>(9);

    for (int i = 0; i < 9; i++) {
        button1 newbutton = new button1();
        buttonArrayList.add(newbutton);
        window.add(buttonArrayList.get(i));
    }
}
}

按钮1.java

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;

public class button1 extends JButton {
int value = 0;
String text = "";

public button1() {

    class ButtonAction extends AbstractAction {
        public ButtonAction() {}
        @Override
        public void actionPerformed(ActionEvent Switcher) {
            System.out.println(text + " " + value);
            value++;//value is a relic from earlier attempts that i just felt like keeping.
            if (text.equals("O")) {
                text = "X";
            } else if (text.equals("X")) {
                text = "";
            } else if (text.equals("")) {
                text = "O";
            }
        }
    }
    this.setAction(new ButtonAction());
    this.setText(text);
    this.setFont(new Font("Arial",Font.PLAIN,120));
}

public String getText()// <----culprit
{
    return text;
}
}

最佳答案

JButton 类有一个为其定义的方法,包括 setText() (它将设置按钮上显示的文本)和 getText() (它将返回按钮上显示的当前文本)。

您创建了一个类button1(注意:类应以大写字母开头)。

您向button1类添加了一个Action,这意味着当该操作被激活时,就会发生一些事情。请注意,在该 actionPerformed 方法中,您应该调用 setText(text) 来更新显示的值。

您还定义了一个 getText() 方法,该方法覆盖 JButton 中定义的 getText() 方法。如果这是一个有意识的设计决策,那么这种方法就很好。事实上,我认为您应该从 Button1 类中删除 getText() 方法,并允许标准 JButton 类处理更新。现在,您试图将实例变量 text 与值保持一致,但该实例变量可能与按钮的实际显示值不一致(考虑另一个类调用 .setText() 在按钮上)。

编辑:确实,在 ButtonAction 中引用 JButton 的 this 不可用。但是,操作本身包含被按下的按钮。

    @Override
    public void actionPerformed(ActionEvent e)
    {
        JButton btn = (JButton)e.getSource();

        // if desired, String cur = btn.getText() may be called to find the
        //  current setting; get and process if needed
        btn.setText(WHAT_EVER_TEXT);
    }

除非有处理当前文本的特定要求(允许选择 O 到 X 到空白),否则我会实现一些东西来跟踪当前回合。这段代码是我正在尝试的东西,它有优点也有缺点(因为它是说明性的):

static class TurnController
{
    // whose turn it is; start with X
    private Player whoseTurn = Player.X;

    // the instance variable
    private static final TurnController instance = new TurnController();


    private TurnController()
    {
    }

    public static Player currentTurn()
    {
        return instance.whoseTurn;
    }

    public static Player nextTurn()
    {
        switch (instance.whoseTurn) {
        case X:
            instance.whoseTurn = Player.O;
            break;

        case O:
            instance.whoseTurn = Player.X;
            break;
        }

        return instance.whoseTurn;
    }

    public static String getMarkerAndAdvance()
    {
        String marker = currentTurn().toString();

        nextTurn();

        return marker;
    }

    enum Player
    {
        X,
        O,
        ;
    }
}

使用此 TurnController,actionPerformed 变为:

    @Override
    public void actionPerformed(ActionEvent e)
    {
        JButton btn = (JButton)e.getSource();

        btn.setText(TurnController.getMarkerAndAdvance());
    }

并且 Button1 类可能删除了 String text 实例变量。

关于java - 需要帮助了解特定 setter/getter 如何影响我的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36491490/

相关文章:

java - 如何通过 JButton 将一个类的数据添加到另一个类的 JTable 中?

java - 尽管我正在声明布局管理器,但为什么没有调用 paintComponent(Graphics)

iphone - [self.navigationController popViewControllerAnimated :YES];? 之后调用什么方法

javascript - JS 中 .push 处的代码损坏。

c# - 在 Android 中调用 .Net Web 服务失败

java - 可以直接向队列发送消息请求吗?

Java KeyListener,尝试根据按下的键改变颜色

java - 方法是否总是必须由对象或类调用? ( java )

java - Spring:如何通过类型参数获取适用的通用 bean 实例?

java - Java 中的时间戳和 mySql 中的时间戳