@Override public void actionPerformed(ActionEvent e) { //当按钮被点击时,发送消息 //创建线程发送消息 new Thread(()->{sendMsg();}).start(); //在后台会启动线程发送消息,界面就不用等待了 //看能否在点击时获取到 // System.out.println(ip+"=============="+portStr); }
时间: 2024-03-11 07:44:31 浏览: 28
这段代码是在 Java Swing 中处理按钮点击事件的代码。当按钮被点击时,会创建一个新的线程并在其中调用 `sendMsg()` 方法,从而完成消息的发送。使用多线程的方式可以避免在发送消息时界面被阻塞,提升用户体验。同时,这段代码中还包含了一行注释,注释掉的代码可以用于获取 `ip` 和 `portStr` 的值,这些值可能是在其他地方设置的。
相关问题
我这里的操作有问题吗: @Override public void actionPerformed(ActionEvent e) { // 如果点击了开始按钮,初始化灯和车辆,并重绘画布 if (e.getSource() == startButton) { crossroad.reset(); // 调用Crossroad对象的reset方法 canvas.repaint(); // 如果点击了模拟按钮,启动一个线程运行控制逻辑和绘制逻辑 } else if (e.getSource() == simulateButton) { Thread thread = new Thread(crossroad); thread.start(); // 如果点击了停止按钮,暂停线程的运行,并重置灯和车辆状态 } else if (e.getSource() == stopButton) { Thread thread = new Thread(crossroad); thread.interrupt(); // 中断线程 crossroad.reset(); // 重置路口对象 canvas.repaint(); // 重绘画布 // 如果点击了退出按钮,关闭窗口 } else if (e.getSource() == exitButton) { this.dispose(); } }
这段代码看起来没有明显的问题,但是需要注意的是,在点击停止按钮时,你创建了一个新的线程并中断它。这可能会导致一些未预期的行为,因为中断一个线程可能会导致它在不完全执行其任务的情况下停止。此外,你还需要确保在重置Crossroad对象之前,已经停止了线程的运行。否则,Crossroad对象可能仍然处于一个不一致的状态。
package Socker; import javax.swing.; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server extends JFrame { private JTextArea chatArea; private JTextField inputField; private final int port = 8000; private Socket clientSocket; private BufferedReader reader; private PrintWriter writer; public Server() { setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("这里是服务器!"); setBounds(750, 100, 800, 600); setAlwaysOnTop(true); JPanel chatPanel = new JPanel(new BorderLayout()); chatArea = new JTextArea(); chatArea.setEditable(false); JScrollPane jScrollPane = new JScrollPane(chatArea); chatPanel.add(jScrollPane, BorderLayout.CENTER); JPanel inputPanel = new JPanel(new FlowLayout()); inputField = new JTextField(50); inputField.setPreferredSize(new Dimension(100, 30)); JButton sendButton = new JButton("发送"); sendButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { sendMessage(inputField.getText()); } }); inputPanel.add(inputField); inputPanel.add(sendButton); Container container = getContentPane(); container.add(chatPanel, BorderLayout.CENTER); container.add(inputPanel, BorderLayout.SOUTH); setVisible(true); startServer(); } private void sendMessage(String text) { if (!text.isEmpty()) { String message = "【服务器】: " + text + "\n"; chatArea.append(message); inputField.setText(""); sendToClient(message); } } private void sendToClient(String message) { writer.println(message); } private void startServer() { try { ServerSocket serverSocket = new ServerSocket(port); System.out.println("服务器已启动,等待客户端连接"); clientSocket = serverSocket.accept(); System.out.println("客户端连接成功:" + clientSocket); reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); writer = new PrintWriter(clientSocket.getOutputStream(), true); new Thread(new ClientListener()).start(); } catch (IOException e) { e.printStackTrace(); } } private class ClientListener implements Runnable { @Override public void run() { try { String message; while ((message = reader.readLine()) != null) { chatArea.append(message + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Server().startServer(); } }); } }这个代码为何无界面显示
这个代码可能无界面显示的原因是因为在主函数中创建了一个新的线程来启动服务器,但是在这个新线程中没有再次调用`setVisible(true)`方法来显示窗口。
可以将主函数的代码修改为如下所示,即在SwingUtilities.invokeLater中再次调用setVisible(true)方法,来确保界面显示正常:
```java
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Server server = new Server();
server.setVisible(true);
server.startServer();
}
});
}
```
这样,就可以保证在启动服务器的同时,也会正确显示界面。
阅读全文