我正在创建一个reversi游戏,并想知道如何改变按钮文本从B到W或反之亦然的点击。
我尝试在我的forloop中添加动作列表,它为游戏创建了我的棋盘。当我单击一个标记为W的按钮时,它将整个第一行按钮更改为B‘。我想要做的是,如果B在单击后更改为W,则只将单击的按钮更改为相反的按钮。
if (src == buttonPos[x][y]
&& buttonPos[x][y].getText() == currentPlayer) {
buttonPos[x][y].setText("W");
} else {
buttonPos[x][y].setText("B");
}预期输出是按下的按钮,将更改为相反的字母,因此,如果b最初将更改为W。
发布于 2019-05-04 14:53:04
我想要它做的只是将单击的按钮更改为相反的按钮。
ActionListener代码太复杂了。不需要循环代码。您已经知道了按钮的来源,所以只需将if/else逻辑应用于该按钮。
此外,不需要创建多个ActionListeners。所有按钮的逻辑是相同的,因此您可以与每个按钮共享相同的ActionListener。
因此,您的代码可能如下所示:
ActionListener al = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
JButton src = (JButton) e.getSource();
String text = button.getText();
button.setText( text.equals("W") ? "B" : "W" );
}
});
for (int x = 0; x < buttonPos.length; x++) {
for (int y = 0; y < buttonPos[x].length; y++) {
buttonPos[x][y] = new JButton();
reversiBoard.add(buttonPos[x][y]);
buttonPos[x][y].addActionListener( al ); // changed
}
}发布于 2019-05-04 14:53:43
您不需要迭代actionPerformed()方法中的所有按钮。还请记住,在检查对象之间的相等性时,应该使用object.equals()而不是==运算符。
用以下方法替换actionPerformed()方法:
public void actionPerformed(ActionEvent e){
JButton button = (JButton) e.getSource();
button.setText(“W”.equals(button.getText()) ? “B” : “W”);
}发布于 2019-05-04 14:59:41
这是整个文件。我已经把听者转移到了一个单独的方法,感觉更干净。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class Board {
private final JButton[][] buttonPos = new JButton[8][8];
private JPanel reversiBoard = new JPanel();
private String currentPlayer;
public Board() {
currentPlayer = "B";
JFrame frame = new JFrame();
frame.getContentPane().add(reversiBoard);
reversiBoard.setLayout(new GridLayout(8, 8, 2, 2));
for (int x = 0; x < buttonPos.length; x++) {
for (int y = 0; y < buttonPos[x].length; y++) {
JButton button = new JButton();
reversiBoard.add(button);
button.addActionListener(this::changeButtonOwner);
buttonPos[x][y] = button;
}
}
frame.setSize(500, 500);
frame.setVisible(true);
buttonPos[4][3].setText("W");
buttonPos[3][3].setText("B");
buttonPos[4][4].setText("B");
buttonPos[3][4].setText("W");
}
private void changeButtonOwner(ActionEvent e) {
JButton src = (JButton) e.getSource();
if (src.getText().equals("B")) src.setText("W");
else if (src.getText().equals("W")) src.setText("B");
}
public JPanel getPanel() {
return reversiBoard;
}
}https://stackoverflow.com/questions/55983560
复制相似问题