[英]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();
}
}
除了您的問題之外,我認為您的代碼中還有其他幾處需要更改。
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 組件被稱為重量級。 請參閱混合重量級和輕量級組件。JButton
時,您應該添加ActionListener而不是MouseListener
。JPanel
的默認布局管理器是FlowLayout
,因此無需顯式設置。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.