Java 取消按钮后的GUI冻结
我有一个gui服务器,它首先调用joptionpanel来输入端口号。。如果我点击OK按钮,它看起来运行良好。但是如果在第一次运行中我单击取消,然后单击确定我的GUI冻结。我认为classJava 取消按钮后的GUI冻结,java,swing,sockets,jbutton,Java,Swing,Sockets,Jbutton,我有一个gui服务器,它首先调用joptionpanel来输入端口号。。如果我点击OK按钮,它看起来运行良好。但是如果在第一次运行中我单击取消,然后单击确定我的GUI冻结。我认为classstart()让它冻结 很抱歉,这是一个重复的问题,但问题可能与其他问题不同 这是我的服务器代码。任何人都可以帮助我。究竟是什么导致gui冻结 public class server { // Main meathod public static void main(String[] args)
start()
让它冻结
很抱歉,这是一个重复的问题,但问题可能与其他问题不同
这是我的服务器代码。任何人都可以帮助我。究竟是什么导致gui冻结
public class server {
// Main meathod
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Throwable e) {
e.printStackTrace();
}
server server2 = new server(PORT);
server2.start();
}
public server(int PORT)
{
sdf = new SimpleDateFormat("[HH:mm:ss]");
go();
}
public void go() {
//The GUI hidden`enter code here`...
connect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
// When Exit button is pressed
if (ae.getSource() == connect) {
start();
}
}
});
}
// Add new threads when new user enters
class reader implements Runnable {
BufferedReader br;
public reader(Socket clientsocket) {
try {
sock = clientsocket;
// Getting input stream
InputStreamReader ir = new InputStreamReader(
sock.getInputStream());
br = new BufferedReader(ir);
} catch (IOException ex) {
info.append(ex + "\n");
}
}
@Override
public void run() {
String msg = null;
String n;
try{
InputStreamReader ir = new InputStreamReader(sock.getInputStream());
br = new BufferedReader(ir);
pw = new PrintWriter(sock.getOutputStream());
// If message is not empty then broadcast message
while((msg=br.readLine())!=null)
{
incoming.append(msg +"\n");
pw.println(); // send the same line back to the client.
pw.flush(); // flush the stream to ensure that the data reaches the other end.
}
}
catch(SocketException ex)
{
info.append("Client Disconnected.\n");
}
catch(IOException ex)
{
info.append(ex+"\n");
}
}
}
private static int setPortNumber()
{
String portNumber = (String) JOptionPane.showInputDialog(frame,
"Enter the Port number for server creation","Server Connection\n",
JOptionPane.OK_CANCEL_OPTION, null, null, PORT);
int PORT = Integer.parseInt(portNumber);
return PORT;
}
// Meathod to handle networking Activities
public void start(){
connected = new ArrayList<PrintWriter>();
try {
PORT = setPortNumber();
ss = new ServerSocket(PORT);
String time = sdf.format(new Date());
info.append(time + "Server Started at port : " + PORT + "\n");
keep = true;
while (keep) {
try {
// Get socket connection
Socket clientsocket = ss.accept();
InetAddress a = clientsocket.getInetAddress();
info.append(a.getHostName() + " at IP Address "
+ a.getHostAddress() + " Connected to server.\n");
// Get output steam
PrintWriter pw = new PrintWriter(
clientsocket.getOutputStream());
connected.add(pw);
// Create and start new thread
Thread t1 = new Thread(new reader(clientsocket));
t1.start();
}
catch (NullPointerException ex) {
info.append("Null pointer Exception ");
} catch (SocketException e) {
info.append("Connection Reset\n");
}
}
} catch (Exception ex) {
info.append("Server has not been connected! Please try again, click connect button.\n");
}
}
公共类服务器{
//主要方法
公共静态void main(字符串[]args){
试一试{
UIManager.setLookAndFeel(“javax.swing.plaf.nimbus.NimbusLookAndFeel”);
}捕获(可丢弃的e){
e、 printStackTrace();
}
服务器server2=新服务器(端口);
server2.start();
}
公共服务器(int端口)
{
sdf=新的简化格式(“[HH:mm:ss]”);
go();
}
公开作废go(){
//GUI隐藏了“在此处输入代码”。。。
connect.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效行动(行动事件ae){
//当按下退出按钮时
如果(ae.getSource()==connect){
start();
}
}
});
}
//当新用户进入时添加新线程
类读取器实现可运行{
缓冲剂;
公共读取器(套接字客户端套接字){
试一试{
sock=clientsocket;
//获取输入流
InputStreamReader ir=新的InputStreamReader(
getInputStream());
br=新的缓冲读取器(ir);
}捕获(IOEX异常){
信息附加(ex+“\n”);
}
}
@凌驾
公开募捐{
字符串msg=null;
字符串n;
试试{
InputStreamReader ir=新的InputStreamReader(sock.getInputStream());
br=新的缓冲读取器(ir);
pw=新的PrintWriter(sock.getOutputStream());
//如果消息不为空,则广播消息
而((msg=br.readLine())!=null)
{
传入的.append(msg+“\n”);
pw.println();//将同一行发送回客户端。
pw.flush();//刷新流以确保数据到达另一端。
}
}
捕获(SocketException例外)
{
info.append(“客户端已断开连接。\n”);
}
捕获(IOEX异常)
{
信息附加(ex+“\n”);
}
}
}
私有静态int setPortNumber()
{
字符串端口号=(字符串)作业窗格。showInputDialog(框架,
“输入用于创建服务器的端口号”“服务器连接\n”,
JOptionPane.OK\u CANCEL\u选项,null,null,PORT);
int PORT=Integer.parseInt(端口号);
返回端口;
}
//处理网络活动的方法
公开作废开始(){
已连接=新的ArrayList();
试一试{
端口=设置端口号();
ss=新服务器套接字(端口);
字符串时间=sdf.format(newdate());
info.append(时间+”服务器在端口:“+端口+”\n”)启动;
保持真实;
同时(保持){
试一试{
//获取套接字连接
Socket clientsocket=ss.accept();
InetAddress a=clientsocket.getInetAddress();
info.append(a.getHostName()+“在IP地址”
+a.getHostAddress()+“已连接到服务器。\n”);
//获得输出蒸汽
PrintWriter pw=新的PrintWriter(
getOutputStream());
已连接。添加(pw);
//创建并启动新线程
线程t1=新线程(新读卡器(clientsocket));
t1.start();
}
捕获(NullPointerException ex){
追加(“空指针异常”);
}捕获(SocketException e){
info.append(“连接重置\n”);
}
}
}捕获(例外情况除外){
info.append(“服务器尚未连接!请重试,单击“连接”按钮。\n”);
}
}
您的start方法最终会调用一个阻止Swing事件线程的while(true)
循环。解决方案是在后台线程中执行此长时间运行的代码,一种体面的方法是使用SwingWorker
。有关此有用构造的更多详细信息,请参阅
重要的一点是:您需要改进代码格式,特别是代码缩进。当前的缩进有误导性,因为您启动了一些内部类,使它们看起来像是外部类。如果您可以使用IDE,请这样做,并允许它帮助改进缩进。否则,请手动执行小心,因为好的缩进可以帮助您一眼就调试代码的某些概念,而坏的缩进可能会误导您和其他人对代码的看法。您的start方法最终会调用
while(true)
阻止Swing事件线程的循环。解决方案是在后台线程中执行此长时间运行的代码,一种体面的方法是使用SwingWorker
。有关此有用构造的更多详细信息,请参阅
重要的一点是:您需要改进代码格式,特别是代码缩进。当前的缩进有误导性,因为您启动了一些内部类,使它们看起来像是外部类。如果您可以使用IDE,请这样做,并允许它帮助改进缩进。否则,请手动执行小心,因为好的缩进可以帮助您一眼就调试代码的某些概念,而坏的缩进可能会误导您和其他人对代码的看法。正如HovercraftFullOfEels所说,您的while()应该位于单独的线程中,