簡體   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