[英]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.