[英]Java Graphical User Interface is Freezing
Why is it that when I execute my Program when I click Enter my Application freezes? 为什么在我单击输入时执行程序时我的应用程序冻结了?
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import java.io.*;
import java.net.*;
public class KnockKnockUI{
private Socket kkSocket = null;
private PrintWriter out = null;
private BufferedReader in = null;
JTextArea clientArea;
JTextArea serverArea;
public KnockKnockUI(){
establishConnection();
initComponents();
}
public void initComponents(){
JFrame frame = new JFrame("Chat");
frame.setVisible(true);
frame.setSize(320,189);
frame.getContentPane().setLayout(null);
serverArea = new JTextArea();
serverArea.setLineWrap(true);
serverArea.setBounds(10, 11, 284, 45);
frame.getContentPane().add(serverArea);
clientArea = new JTextArea();
clientArea.setBounds(10, 67, 284, 46);
frame.getContentPane().add(clientArea);
JButton btnEnter = new JButton("Enter");
btnEnter.setBounds(96, 124, 89, 23);
frame.getContentPane().add(btnEnter);
btnEnter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try{
in.readLine();
}catch(Exception e){
}
String fromUser = clientArea.getText();
try {
fromUser = in.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
serverArea.setText(fromUser);
}
});
}
public void establishConnection(){
//Establishes Connection
try {
kkSocket = new Socket("localhost", 4444);
//
out = new PrintWriter(kkSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: taranis.");
System.exit(1);
}
}
public static void main(String[] args){
KnockKnockUI ui = new KnockKnockUI();
}
}
This is a simple chat client using Java, there are other classes that I didn't include. 这是一个使用Java的简单聊天客户端,我没有包含其他类。 like The Server class and the Protocol class
像服务器类和协议类
When you hit enter, the following is executed: 当您按回车键时,将执行以下操作:
try {
in.readLine();
} catch (Exception e) {
}
String fromUser = clientArea.getText();
try {
fromUser = in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
serverArea.setText(fromUser);
This chunk of code is being performed on the Event Dispatch Thread , which handles all Swing events. 这部分代码是在处理所有 Swing事件的Event Dispatch Thread上执行的。 Your calls to
in.readLine()
will block until a line of input is available from your Socket
, causing unhandled events to back up and thus causing your program to become unresponsive. 您对
in.readLine()
调用将阻塞,直到Socket
有一行输入可用为止为止,从而导致未处理的事件备份,从而导致程序无响应。 If you want to perform a time expensive task, take a look at a SwingWorker
( SwingWorker
tutorial ). 如果要执行耗时的任务,请查看
SwingWorker
( SwingWorker
教程 )。
Side note: Catching an Exception
without printing its stack trace is almost always a bad idea. 注意:在不打印堆栈跟踪的
Exception
下捕获Exception
几乎总是一个坏主意。 It can make problems with your code harder, if not impossible, to catch. 如果不是不可能的话,这会使代码问题更难发现。
setSize of frame below means after adding all components 以下框架的setSize表示添加所有组件后
public void initComponents(){ 公共无效initComponents(){
JFrame frame = new JFrame("Chat");
frame.getContentPane().setLayout(null);
serverArea = new JTextArea();
serverArea.setLineWrap(true);
serverArea.setBounds(10, 11, 284, 45);
frame.getContentPane().add(serverArea);
clientArea = new JTextArea();
clientArea.setBounds(10, 67, 284, 46);
frame.getContentPane().add(clientArea);
JButton btnEnter = new JButton("Enter");
btnEnter.setBounds(96, 124, 89, 23);
frame.getContentPane().add(btnEnter);
btnEnter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try{
in.readLine();
}catch(Exception e){
}
String fromUser = clientArea.getText();
try {
fromUser = in.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
serverArea.setText(fromUser);
}
});
frame.setVisible(true);
frame.setSize(320,189);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.