我正在尝试使用Java Swing创建一个双人游戏。
我有一个JButton
。
我的想法是在点击JButton
时切换到其他玩家。当玩家单击JButton
时,它将成为玩家的两个回合;当玩家两次点击时,它变成了玩家的一个回合。
但是到目前为止,我的代码不允许程序等待玩家二次点击。当玩家点击一下时,玩家二被认为也已经点击过。
如何通过让程序等待玩家二次点击来解决这个问题?
boolean game = true;
final boolean p1 = false;
final boolean p2 = false;
...
while (game) {
p1 = true;
while (p1) {
enterMoveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
doSomething();
p1 = false;
p2 = true;
}
});
}
while (p2) {
enterMoveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
doSomething();
p2 = false;
p1 = true;
}
});
}
}
答案 0 :(得分:3)
我建议改为使用JToggleButton。有关使用它们的信息,请参阅 The Java Tutorial中的How to Use Buttons, Check Boxes, and Radio Buttons部分。
答案 1 :(得分:2)
为什么不禁用没有转弯的玩家JButton
,然后在玩家轮到他并启用对手按钮时启用。
button.setEnabled(false);
假设你有两个不同的按钮
祝你好运!答案 2 :(得分:2)
由于您正在编码Swing,因此不要执行while (true)
循环,因为您将阻止事件线程EDT。相反,你应该使用Swing Timer,或者更有可能在你的情况下,因为我猜你正在玩回合制游戏(如果错误请纠正我),根据事件做出动作。使用后者,而不是交换ActionListeners,您只需通过单个字段更改程序状态,并根据此状态更改ActionListener的行为。
有关后者的示例,请参阅以下代码。程序的状态由playerIndex int变量保存:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class ToggleGame extends JPanel {
public static final String[] PLAYERS = {"Player 1", "Player 2"};
// turnIndex is either 0 or 1, depending on whose turn it is.
private int turnIndex = 0;
private JButton turnButton = new JButton(PLAYERS[turnIndex]);
public ToggleGame() {
add(new JLabel("Turn:"));
add(turnButton);
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
turnButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
turnBtnAction(evt);
}
});
}
private void turnBtnAction(ActionEvent evt) {
turnIndex++; // next player
turnIndex %= PLAYERS.length; // mod 2
turnButton.setText(PLAYERS[turnIndex]);
doSomething(turnIndex);
}
private void doSomething(int index) {
String msg = "It is now " + PLAYERS[index] + "'s turn!";
String title = "Whose Turn Is It?";
JOptionPane.showMessageDialog(this, msg , title, JOptionPane.INFORMATION_MESSAGE);
}
private static void createAndShowGui() {
ToggleGame mainPanel = new ToggleGame();
JFrame frame = new JFrame("ToggleGame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
答案 3 :(得分:1)
当玩家点击一下时,玩家二被认为也已经点击了
这是因为您使用addActionListener。当您调用此方法时,它不会替换前一个方法。它只是为按钮点击添加了另一个监听器。单击它时,它将执行添加到按钮的所有侦听器。
您可以通过定义两个actionListeners来解决此问题:
ActionListener a1 = new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
doSomething();
p1 = false;
p2 = true;
}
};
ActionListener a2 = new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
doSomething();
p2 = false;
p1 = true;
}
};
while(game){
p1 = true;
while(p1){
enterMoveButton.removeActionListener(a2);
enterMoveButton.addActionListener(a1);
}
while(p2){
enterMoveButton.removeActionListener(a1);
enterMoveButton.addActionListener(a2);
}
答案 4 :(得分:1)
为什么不使用两个布尔变量,而只使用一个如:
boolean myturn = true; // at the start for Player 1 it's true.
@Override
public void actionPerformed(ActionEvent arg0)
{
if (myturn == true)
{
doSomething(); // Do whatever Player1 is suppose to do at his turn.
// Now since myturn will be false after this, so Player1
// won't be able to move till Player 2 takes his turn.
myturn = false;
}
else if (myturn == false)
{
doThisInstead(); // Do whatever Player2 is suppose to do at his turn.
// Here again myturn will will change to true, now Player2
// won't be able to move till Player1 makes his next move.
myturn = true;
}
}
以下代码解释了我刚才所说的内容:
import javax.swing.*;
import java.awt.event.*;
public class ButtonTest extends JFrame implements ActionListener
{
private JPanel panel;
private JButton button;
private JLabel label;
private String player1 = "I am player one.";
private String player2 = "I am player two.";
private boolean myturn = true;
public ButtonTest()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
button = new JButton(player1);
label = new JLabel(player1);
button.addActionListener(this);
panel.add(label);
panel.add(button);
setContentPane(panel);
pack();
}
public void actionPerformed(ActionEvent ae)
{
if (myturn == true)
{
button.setText(player2);
label.setText(player2);
myturn = false;
}
else if (myturn == false)
{
button.setText(player1);
label.setText(player1);
myturn = true;
}
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new ButtonTest().setVisible(true);
}
});
}
}
单个变量可以帮助您,而不是使用两个不同的。
希望这可能在某种程度上有所帮助。 此致