簡體   English   中英

為什么我的按鈕在點擊后沒有變化?

[英]Why doesn't my button change after clicking?

請幫助解決問題。 我需要 label 在單擊我的按鈕后更改為X ,在第二次單擊后更改為O 請檢查我下面的代碼,並告訴我出了什么問題? 我的程序只是將 label 更改為X ,但不會更改為O :(

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

public class test extends MouseAdapter {
    JPanel windowContent;
    JFrame frame;
    Button myButton;
    test() {
        windowContent = new JPanel();
        FlowLayout fl = new FlowLayout();
        windowContent.setLayout(fl);
        
        myButton = new Button("Change text");
        myButton.addMouseListener(this);
        windowContent.add(myButton);
        
        frame = new JFrame("Tic Tac Toe");
        frame.setContentPane(windowContent);
        frame.setSize(100, 100);
        frame.setVisible(true);
    }
    
    public void mouseClicked(MouseEvent e) {
        int i = 0;
        if (i == 0) {
            myButton.setLabel("X");
            i++;
        } else if (i == 1) {
            myButton.setLabel("O");
        }
    }
    
    public static void main(String[] args) {
        new test();
    }

}

除了您的問題之外,我認為您的代碼中還有其他幾處需要更改。

  1. I don't know if it's a mistake or if it's intentional, but the type for variable myButton should be javax.swing.JButton and not java.awt.Button because you should, as much as possible, not mix AWT components with Swing components因為Swing組件被認為是輕量級的,而 AWT 組件被稱為重量級 請參閱混合重量級和輕量級組件
  2. 使用JButton時,您應該添加ActionListener而不是MouseListener
  3. JPanel的默認布局管理器FlowLayout ,因此無需顯式設置。
  4. 我建議使用客戶端屬性,而不是要求單獨的變量來記錄JButton被單擊的次數。

這是我對實現上述幾點的test class 的重寫。 請注意,我將 class 的名稱從test更改為Testing0

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Testing0 implements ActionListener {
    JPanel windowContent;
    JFrame frame;

    public Testing0() {
        windowContent = new JPanel();
        
        JButton myButton = new JButton("Change text");
        myButton.putClientProperty("count", Integer.valueOf(0));
        myButton.addActionListener(this);
        windowContent.add(myButton);
        
        frame = new JFrame("Tic Tac Toe");
        frame.setContentPane(windowContent);
        frame.setSize(100, 100);
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent event) {
        Object source = event.getSource();
        if (source instanceof JButton) {
            JButton button = (JButton) source;
            Object value = button.getClientProperty("count");
            if (value instanceof Integer) {
                Integer objVal = (Integer) value;
                int intVal = objVal.intValue();
                String text = switch (intVal) {
                    case 0 -> "X";
                    case 1 -> "O";
                    default -> "";
                };
                button.setText(text);
                intVal = intVal == 0 ? 1 : 0;
                button.putClientProperty("count", Integer.valueOf(intVal));
            }
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new Testing0());
    }
}

上述代碼中的方法actionPerformed使用了在 Java 12 中引入的switch 表達式

雖然您的問題中沒有具體說明,但上面的代碼替換了JButton的文本。 如果文本為X則在單擊按鈕時更改為O ,如果文本為O則更改為X 您可以根據需要多次單擊該按鈕,文本將從X變為O並再次變回。

您的i變量始終設置為 0 的原因是您在mouseClicked function 中對其進行了初始化。 所以每次調用 function 時,總是將i設置為 0。

public void mouseClicked(MouseEvent e) {
        int i = 0;      //here is the problem
        if (i == 0) {
            myButton.setLabel("X");
            i++;
        } else if (i == 1) {
            myButton.setLabel("O");
        }
    }

嘗試在鼠標外初始化它點擊mouseClicked

  • i從 function mouseClicked移出,放到全局空間。 它可以防止重置i值。
  • 我重命名i ,新名稱是buttonStateChanger
  • 此外,在else塊中重置buttonStateChanger
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonTest extends MouseAdapter {
    JPanel windowContent;
    JFrame frame;
    Button myButton;
    int buttonStateChanger = 0;
    ButtonTest() {
        windowContent = new JPanel();
        FlowLayout fl = new FlowLayout();
        windowContent.setLayout(fl);
        
        myButton = new Button("Change text");
        myButton.addMouseListener(this);
        windowContent.add(myButton);
        
        frame = new JFrame("Tic Tac Toe");
        frame.setContentPane(windowContent);
        frame.setSize(100, 100);
        frame.setVisible(true);
    }
    
    public void mouseClicked(MouseEvent e) {

        if (buttonStateChanger == 0) {
            myButton.setLabel("X");
            buttonStateChanger++;
        } else if (buttonStateChanger == 1) {
            myButton.setLabel("O");
            buttonStateChanger = 0;
        }
    }
    
    public static void main(String[] args) {
        new ButtonTest();
    }

}

在此處輸入圖像描述 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM