gpt4 book ai didi

Java onclick 监听器

转载 作者:行者123 更新时间:2023-12-04 05:42:55 26 4
gpt4 key购买 nike

我有一个简单的程序,允许 2 个客户端连接到服务器。

连接后,他们可以轮流点击空白卡片图像。

一旦 2 个客户中的任何一个点击空白卡片图片,卡片图片将变为 Ace 俱乐部图片。

更改将显示在客户端的两侧,并且两个客户端的点击都将被禁用。

2 秒后,它变回空白卡片图像,客户可以再次点击。


问题

我可以在客户点击后在两侧显示 Ace 俱乐部图像,但是当图像在 2 秒后变回空白卡片图像时,我无法再点击它。

这是我在 run() 方法中尝试过的(已更新)

public void run() {

while(true) {
try {
while (true) {
response = is.readLine();
if(!response.equals("")) {
System.out.println(response);
responded = true;
}
break;
}
} catch (IOException e) {
System.err.println("IOException: " + e);
}
if(responded) {
timer = new Timer(1000,new TimerC());
timer.start();
responded = false;
}
}
}

这是我为客户提供的完整代码。请帮忙

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.ImageIcon;
import javax.swing.Timer;

public class Client implements Runnable {

static Socket clientSocket = null;
ObjectInputStream in = null;
String serverMsg;
static PrintStream os = null;
static DataInputStream is = null;
static boolean closed = false;
static String s = "";
static String cardType = "";
static GameUI gameUI;
int countdown = 3;
Timer timer = new Timer(1000,null);
String response = null;
boolean responded = false;

public static void main(String args[]) {
try {
clientSocket = new Socket("localhost", 5550);
os = new PrintStream(clientSocket.getOutputStream());
is = new DataInputStream(clientSocket.getInputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

gameUI = new GameUI();

gameUI.cardOne.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
s = gameUI.cardOne.getText();

}
});

if (clientSocket != null && os != null && is != null) {
try {
new Thread(new Client()).start();
while (!closed) {
os.println(s.trim());
}

os.close();
is.close();
clientSocket.close();
} catch (IOException e) {
System.err.println("IOException: " + e);
}
}

}

public void run() {
try {
while (true && !responded) {
response = is.readLine();
if(!response.equals("")) {
System.out.println(response);
responded = true;
break;
}
}

} catch (IOException e) {
System.err.println("IOException: " + e);
}

if(responded) {
timer = new Timer(1000,new TimerC());
timer.start();
responded = false;
}
}

class TimerC implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
if(countdown == 0) {
timer.stop();
gameUI.cardOne.setIcon(new ImageIcon(GameUI.revealCard("blank.png")));
countdown = 3;
}

else {
gameUI.cardOne.setIcon(new ImageIcon(GameUI.revealCard(response)));
countdown--;
System.out.println(countdown);

}
}
}
}

最佳答案

当然,客户端和服务器都使用缓冲流。这是套接字连接的本质。它不会逐字节发送信息。它发送缓冲区。您的逻辑与行一起运行,它等待行尾字符。它可能位于缓冲区的中间,因此您的程序将等到缓冲区已满并且可能有很多行。

要消除这个等待发送部分(在服务器和客户端上)应该使用 flush method立即发送数据。

特别是在客户端添加一行代码

 while (!closed) {
os.println(s.trim());
os.flush(); // <- send immediately right now
}

如果您从服务器端发送内容,则在服务器端类似。

关于Java onclick 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36808784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com