我目前正在从事国际象棋项目。
我已经从控制台设置了一个工作代码,我正在设置一个带有swing的GUI。调试我的应用程序,我看到我的主要和我的GUI运行在不同的线程,所以我来到以下问题。
有没有办法让我的主线程在等待用户点击棋子时进入睡眠状态,然后在点击后恢复?
要进行上下文化,我有一个8x8的按钮数组(board[i][j]
),我为每个按钮设置了一个自定义操作,将i
和j
保存到我声明的2个静态变量中我的主要。因此,在单击按钮后,我将该按钮的坐标发送到我的主代码,该代码在" real"棋子矩阵调用控制方法。
这是正确的方法吗?
答案 0 :(得分:3)
有没有办法让我的主线程在等待用户点击棋子时进入睡眠状态,然后在点击后恢复?
这是错误的思考方式。 GUI应该是事件驱动的,而不是在无限循环中等待输入(或主要获取输入)。
但问题是(通常)试图“匹配”基于命令行的应用程序和应用程序。用GUI。
我这样说是因为它听起来像基于命令行的应用程序。没有遇到为ChessGameModel
创建数据结构的麻烦,这些数据结构可以由玩家操作并且可能在可能需要与之交互的不同类之间共享。类似......基于命令行的前端,或各种类的GUI,或者是通过网络在人们之间运行国际象棋游戏的服务器。
构建ChessGameModel
,其余的将更加简单。
答案 1 :(得分:1)
如果您点击某个按钮时设置了一个由您的"主线程"连续检查的变量,该怎么办。
//In your GUIClass (GUI Thread)
btnInput1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
oProcess.setInput("Forward");
}
});
//In your Process Class (Main Thread)
private String input;
public void setInput(String input){
this.input = input;
}
public void checkInput(){
while(true){
if(input.equals("")
{
//Do nothing
Thread.Sleep(1); //Sleep so your loop doesn't use 100% of your processor
} else {
if(input.equals("Forward")
{
//Do the action
}
}
}
}
但您需要与GUI线程共享您的流程类的实例,以便您可以使用相同的变量。
(抱歉我的拼写)
答案 2 :(得分:1)
答案是:是的,但你不应该。
将线程置于“休眠”会浪费CPU周期。相反,在以“事件驱动”的方式接收输入之后,你应该努力制作你在主线程上做的东西。
首先你应该已经有一些包含董事会的课程。如果你还没有:现在是时候了;)
您要做的下一件事是不要将该类作为GUI,因为GUI不应该关注游戏逻辑。
然后它变得简单,假设遵循GUI字段:
private Board board = // your actual board;
// assuming Java 8
button.addActionListener((event) -> {
board.recieveAction(i, j);
});