Java 如何等待鼠标按下?

Java 如何等待鼠标按下?,java,mouse,wait,mouselistener,Java,Mouse,Wait,Mouselistener,所以,我知道以前有人问过这个问题,但是这些答案在我目前的课程结构中是行不通的。我有一个抽签游戏。在游戏算法中,当轮到用户时,我让它调用一个方法来获得鼠标点击的X&Y坐标。但是,我希望此方法首先提示用户单击,然后等待用户单击,然后获取用于游戏算法的单击的x&y。目前,它只是拉最后一次点击的x&y键,用户没有时间在回合开始时点击。我唯一需要解决这个问题的想法是在两个线程上运行游戏和用户代码,并进行一次睡眠。但是,这似乎过于复杂,我不想这样做。整个情况似乎是一个非常基本的问题,在执行代码之前等待鼠标单

所以,我知道以前有人问过这个问题,但是这些答案在我目前的课程结构中是行不通的。我有一个抽签游戏。在游戏算法中,当轮到用户时,我让它调用一个方法来获得鼠标点击的X&Y坐标。但是,我希望此方法首先提示用户单击,然后等待用户单击,然后获取用于游戏算法的单击的x&y。目前,它只是拉最后一次点击的x&y键,用户没有时间在回合开始时点击。我唯一需要解决这个问题的想法是在两个线程上运行游戏和用户代码,并进行一次睡眠。但是,这似乎过于复杂,我不想这样做。整个情况似乎是一个非常基本的问题,在执行代码之前等待鼠标单击。我该怎么做

void takeTurn() {

        //turnCount++;

        while(gameOver == false) {


        if (turn == 'O') {
            O.getInput();
            if(board[O.x][O.y] != '\u0000') continue;
            board[O.x][O.y] = 'O';
        }
        else if (turn == 'X') {
            X.getInput();
            if(board[X.x][X.y] != '\u0000') continue;
            board[X.x][X.y] = 'X';
        }

        printBoard();
         if (checkWinner(turn) == turn) {
            System.out.println("Winner: " + turn);
        }



        if (turn == 'O') turn = 'X';
        else if (turn == 'X') turn = 'O';

    }


    }
编辑: getInput()是获取x&y值的方法

public void getInput() {

    System.out.println("Click on your tile");
    //wait for click here
    //then get x & y of click
} 
编辑:
好的,那么使用ActionListener,如何让线程等待一个动作执行完毕

你倒过来了,这不是说你需要等待输入。您需要做的是单击鼠标时的操作。说所有其他问题都能回答你想做的事情。你可以跟进并提出解决方案。另一个很好的例子是

键不是“等待”鼠标输入,而是根据其状态将程序的行为更改为鼠标按下。例如,如果你在做tic-tac-toe,你会给程序一个变量,让它知道该轮到谁了,这可以是一个简单的布尔变量,比如

private boolean xTurn = true;
当这个变量为真时,轮到X了,当为假时,轮到O了

然后在MouseListener(如果是Swing应用程序)中,使用该变量帮助决定要执行的操作,然后在使用该变量后,将布尔值切换到下一个状态。例如:

// within mouse listener
if (xTurn) {
    label.setForeground(X_COLOR);
    label.setText("X");
} else {
    label.setForeground(O_COLOR);
    label.setText("O");
}
// toggle value held by boolean variable.
xTurn = !xTurn;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

@SuppressWarnings("serial")
public class TicTacToePanel extends JPanel {
    private static final int ROWS = 3;
    private static final int MY_C = 240;
    private static final Color BG = new Color(MY_C, MY_C, MY_C);
    private static final int PTS = 60;
    private static final Font FONT = new Font(Font.SANS_SERIF, Font.BOLD, PTS);
    public static final Color X_COLOR = Color.BLUE;
    public static final Color O_COLOR = Color.RED;
    private JLabel[][] labels = new JLabel[ROWS][ROWS];
    private boolean xTurn = true;

    public TicTacToePanel() {
        setLayout(new GridLayout(ROWS, ROWS, 2, 2));
        setBackground(Color.black);

        MyMouse myMouse = new MyMouse();
        for (int row = 0; row < labels.length; row++) {
            for (int col = 0; col < labels[row].length; col++) {
                JLabel label = new JLabel("     ", SwingConstants.CENTER);
                label.setOpaque(true);
                label.setBackground(BG);
                label.setFont(FONT);
                add(label);
                label.addMouseListener(myMouse);
            }
        }
    }

    private class MyMouse extends MouseAdapter {
        @Override // override mousePressed not mouseClicked
        public void mousePressed(MouseEvent e) {
            JLabel label = (JLabel) e.getSource();
            String text = label.getText().trim();
            if (!text.isEmpty()) {
                return;
            }
            if (xTurn) {
                label.setForeground(X_COLOR);
                label.setText("X");
            } else {
                label.setForeground(O_COLOR);
                label.setText("O");
            }

            // information to help check for win
            int chosenX = -1;
            int chosenY = -1;
            for (int x = 0; x < labels.length; x++) {
                for (int y = 0; y < labels[x].length; y++) {
                    if (labels[x][y] == label) {
                        chosenX = x;
                        chosenY = y;
                    }
                }
            }
            // TODO: check for win here
            xTurn = !xTurn;
        }
    }

    private static void createAndShowGui() {
        TicTacToePanel mainPanel = new TicTacToePanel();

        JFrame frame = new JFrame("Tic Tac Toe");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_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();
            }
        });
    }
}
例如:

// within mouse listener
if (xTurn) {
    label.setForeground(X_COLOR);
    label.setText("X");
} else {
    label.setForeground(O_COLOR);
    label.setText("O");
}
// toggle value held by boolean variable.
xTurn = !xTurn;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

@SuppressWarnings("serial")
public class TicTacToePanel extends JPanel {
    private static final int ROWS = 3;
    private static final int MY_C = 240;
    private static final Color BG = new Color(MY_C, MY_C, MY_C);
    private static final int PTS = 60;
    private static final Font FONT = new Font(Font.SANS_SERIF, Font.BOLD, PTS);
    public static final Color X_COLOR = Color.BLUE;
    public static final Color O_COLOR = Color.RED;
    private JLabel[][] labels = new JLabel[ROWS][ROWS];
    private boolean xTurn = true;

    public TicTacToePanel() {
        setLayout(new GridLayout(ROWS, ROWS, 2, 2));
        setBackground(Color.black);

        MyMouse myMouse = new MyMouse();
        for (int row = 0; row < labels.length; row++) {
            for (int col = 0; col < labels[row].length; col++) {
                JLabel label = new JLabel("     ", SwingConstants.CENTER);
                label.setOpaque(true);
                label.setBackground(BG);
                label.setFont(FONT);
                add(label);
                label.addMouseListener(myMouse);
            }
        }
    }

    private class MyMouse extends MouseAdapter {
        @Override // override mousePressed not mouseClicked
        public void mousePressed(MouseEvent e) {
            JLabel label = (JLabel) e.getSource();
            String text = label.getText().trim();
            if (!text.isEmpty()) {
                return;
            }
            if (xTurn) {
                label.setForeground(X_COLOR);
                label.setText("X");
            } else {
                label.setForeground(O_COLOR);
                label.setText("O");
            }

            // information to help check for win
            int chosenX = -1;
            int chosenY = -1;
            for (int x = 0; x < labels.length; x++) {
                for (int y = 0; y < labels[x].length; y++) {
                    if (labels[x][y] == label) {
                        chosenX = x;
                        chosenY = y;
                    }
                }
            }
            // TODO: check for win here
            xTurn = !xTurn;
        }
    }

    private static void createAndShowGui() {
        TicTacToePanel mainPanel = new TicTacToePanel();

        JFrame frame = new JFrame("Tic Tac Toe");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_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();
            }
        });
    }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
@抑制警告(“串行”)
公共类TictoePanel扩展了JPanel{
私有静态最终整数行=3;
私有静态最终int MY_C=240;
私有静态最终颜色BG=新颜色(MY_C,MY_C,MY_C);
专用静态最终积分=60;
私有静态最终字体字体=新字体(Font.SANS_SERIF,Font.BOLD,PTS);
公共静态最终颜色X_Color=Color.BLUE;
公共静态最终颜色O_Color=Color.RED;
私有JLabel[][]标签=新JLabel[行][行];
私有布尔xtorn=true;
公共事务委员会{
setLayout(新的GridLayout(行,行,2,2));
挫折背景(颜色:黑色);
MyMouse MyMouse=新建MyMouse();
对于(int row=0;row
@redFIVE对不起,我的错,不知怎么的,我忘了添加它。好的,谢谢你的例子,这很有帮助。给我一分钟看一下,我想我知道你和@StackFlowed在这里得到了什么。抱歉,我不明白,还在这里学习。再次感谢气垫船,我明白了。只是稍微改变了一下我的结构,当按下鼠标时,它会做它需要做的事情,然后切换。这里的一个问题是,我在我的游戏类中创建了两个用户类(一个用于x,一个用于o),因为我最终想将一些网络应用到这个程序中。因此,我需要以某种方式指定谁在输入。我该怎么做?