繁体   English   中英

在 Java Swing 中更改按钮文本时遇到问题

[英]Having issues changing button text in Java Swing

我正在尝试测试通过 actionlistener 更改按钮文本的方法。 这是我的代码:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TCTBack implements ActionListener {

    JFrame frame;
    JPanel panel;
    JLabel label1;
    JButton button1;
    String turn;

    public TCTBack() {

        turn = "-";

        panel = new JPanel();
        panel.setSize(500, 500);

        frame = new JFrame();
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);

        panel.setLayout(null);

        label1 = new JLabel("Interactive Button Test");
        label1.setBounds(10,20,80,25);
        panel.add(label1);

        button1 = new JButton("Button");
        button1.setBounds(10,80,80,25);
        button1.addActionListener(this);
        panel.add(button1);

        frame.setVisible(true);

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        switch (turn) {
            case "-" -> {
                turn = "X";
                button1.setText("X");
            }
            case "x" -> {
                turn = "O";
                button1.setText("O");
            }
            case "O" -> {
                turn = "-";
                button1.setText("-");
            }
        }

    }

    public static void main(String[] args) {

        new TCTBack();

    }

}

它会更改按钮的文本一次,但在我再次单击该按钮后不会更改它。 我的目标是能够将按钮的文本从默认值(“-”)更改为 X,然后更改为 O,然后返回到 -。 任何帮助将不胜感激,谢谢。 另外,我是提问的新手,所以如果我遗漏了任何信息,请告诉我。

因为您将文本更改为X但您检查它是否等于x

case "X" -> {
    ...
}

turn = "X"

case "x"

一个是大写的 X,一个不是。

提示:如果您认为 switch 是“详尽的”(应始终匹配 case 语句),请使用throw new IllegalStateException();添加default throw new IllegalStateException(); 或一些这样的。 或者使用 switch 作为表达式,在这种情况下,java 将免费为您提供。

定义常量。 使用常量可以防止像您这样的错误。
以下是我建议您根据提议的更改进行更改的代码部分。 代码后的说明。

public class TCTBack implements ActionListener {
    private static final String NONE = "-";
    private static final String O = "O";
    private static final String X = "X";

    public TCTBack() {
        button1 = new JButton(NONE);
    }

    public void actionPerformed(ActionEvent e) {
        String actionCommand = e.getActionCommand();
        String newVal;
        switch (actionCommand) {
            case NONE:
                newVal = X;
                break;
            case O:
                newVal = NONE;
                break;
            case X:
                newVal = O;
                break;
            default:
                newVal = null;
                JOPtionPane.showMessageDialog(frame,
                                              actionCommand,
                                              "Unhandled",
                                              JOptionPane.WARNING_MESSAGE);
        }
        if (newVal != null) {
            button1.setActionCommand(newVal);
            button1.setText(newVal);
        }
    }
}

当您使用接受单个String参数的构造函数创建JButton ,您设置了按钮的文本及其操作 command 传递给方法actionPerformed()ActionEvent对象包含此操作命令字符串。

但是,调用JButton类的setText()方法不会更改action command ,因此您还需要通过方法setActionCommand()更新它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM