Java 错误的按钮激活
我希望我单击的按钮被禁用并显示图像,但以下程序正在禁用帧中的最后一个按钮,无论我单击哪个按钮,我做错了什么Java 错误的按钮激活,java,Java,我希望我单击的按钮被禁用并显示图像,但以下程序正在禁用帧中的最后一个按钮,无论我单击哪个按钮,我做错了什么 import java.awt.*; import java.awt.event.*; import javax.swing.*; class TicTacToe{ public static void main(String args[]){ EventQueue.invokeLater(new Runnable(){ public vo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class TicTacToe{
public static void main(String args[]){
EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frame=new GameFrame();
frame.setTitle("BATTLESHIPS");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Image img=new ImageIcon("icon.gif").getImage();
frame.setIconImage(img);
}
});
}
}
class GamePanel extends JPanel{
private JPanel panel;
private boolean start;
private ActionListener listener;
public GamePanel(){
start=true;
setLayout(new BorderLayout());
panel=new JPanel();
panel.setLayout(new GridLayout(3,3));
listener=new ClickButton();
addButton("");
addButton("");
addButton("");
addButton("");
addButton("");
addButton("");
addButton("");
addButton("");
addButton("");
add(panel,BorderLayout.CENTER);
}
void addButton(String label){
JButton button=new JButton(label);
button.addActionListener(listener);
panel.add(button);
}
class ClickButton implements ActionListener{
public void actionPerformed(ActionEvent event){
String input=event.getActionCommand();
if(start){
{
Image img=new ImageIcon("icon.gif").getImage();
button.setText("");
button.setIcon(new ImageIcon(img));
button.setEnabled(false);
}
}
}
}
}
class GameFrame extends JFrame{
public GameFrame(){
add(new GamePanel());
pack();
}
}
动作侦听器仅引用上次创建的按钮的值。动作侦听器仅引用上次创建的按钮的值。这是因为您正在禁用上次添加的按钮 您应该使用单击的按钮,可以通过
event.getSource()
获得该按钮。应该是这样的:
public void actionPerformed(ActionEvent event){
String input=event.getActionCommand();
if(start){
{
Image img=new ImageIcon("icon.gif").getImage();
JButton clicked = (JButton)event.getSource();
clicked.setText("");
clicked.setIcon(new ImageIcon(img));
clicked.setEnabled(false);
}
}
}
这是因为您正在禁用上次添加的
按钮
您应该使用单击的按钮,可以通过event.getSource()
获得该按钮。应该是这样的:
public void actionPerformed(ActionEvent event){
String input=event.getActionCommand();
if(start){
{
Image img=new ImageIcon("icon.gif").getImage();
JButton clicked = (JButton)event.getSource();
clicked.setText("");
clicked.setIcon(new ImageIcon(img));
clicked.setEnabled(false);
}
}
}
更糟糕的是,当您在addButton()
中重写它时,所有其他按钮都没有参考。因此,为了准确地回答这个问题,您所犯的错误是addButton()
方法,以及您每次都在不检查任何内容的情况下覆盖button
的值。更糟糕的是,您在addButton()
中过度编写的所有其他按钮都没有参考。因此,为了准确地回答这个问题,您所犯的错误是addButton()
方法,并且您每次都会覆盖按钮的值,而不检查任何内容。@hugososa,因为按钮
字段仍然包含一个伪值,而且数据结构不会反映屏幕上的实际内容。对于您的解决方案,这个侦听器可以工作,但其余的代码仍然是错误的。解决方案可能是完全删除按钮
字段,或者将其替换为包含所有已创建按钮的集合。@biziclop我应该对代码进行哪些更改才能使其正确?@biziclop可能OP甚至不需要该按钮
。但是我想他知道,按钮实际上是指最后创建/添加的按钮。@user3798851我们都是新手,所以我知道感觉如何。在这种情况下,正如@hugosusa所说,您需要做的是完全去掉按钮
字段。它实际上并没有给你买任何东西,正如你所看到的,它很容易误导代码的读者。@user3798851只需从类成员中删除按钮即可。你不需要它。在addButton
方法中,只需创建一个新实例-JButton-button=newjbutton(label)代码>-并添加它,就是这样。@hugosusa,因为按钮
字段仍将包含虚假值,并且数据结构不会反映屏幕上的实际内容。对于您的解决方案,这个侦听器可以工作,但其余的代码仍然是错误的。解决方案可能是完全删除按钮
字段,或者将其替换为包含所有已创建按钮的集合。@biziclop我应该对代码进行哪些更改才能使其正确?@biziclop可能OP甚至不需要该按钮
。但是我想他知道,按钮实际上是指最后创建/添加的按钮。@user3798851我们都是新手,所以我知道感觉如何。在这种情况下,正如@hugosusa所说,您需要做的是完全去掉按钮
字段。它实际上并没有给你买任何东西,正如你所看到的,它很容易误导代码的读者。@user3798851只需从类成员中删除按钮即可。你不需要它。在addButton
方法中,只需创建一个新实例-JButton-button=newjbutton(label)代码>-并添加它,就这样。到目前为止,您已经问了7个问题,但从未接受过答案。你知道吗,你应该接受对你帮助最大的答案,这样回答者就能从帮助你的努力中得到回报?你知道如何接受答案吗?请看这里:对不起,我真的不知道:(到目前为止,你已经问了7个问题,但从未接受过答案。你知道你应该接受对你帮助最大的答案吗?因此,回答者会从帮助你的努力中得到回报吗?你知道如何接受答案吗?请看这里:对不起,我真的不知道:(