selico 2021-09-12 14:41 采纳率: 87.5%
浏览 41
已结题

Java以登录窗口创建一个客服端窗口,导致客户端组件不显示问题

问题:使用客户端直接运行可以完成客户端和服务器端的信息发送和接受。
但是使用登录界面通过密码验证后创建客户端会导致客户端窗口出现后,但是其内部的组件不显示,直到关闭服务端后重写出现。

img

//代码部分:

服务端:


import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyServer extends JFrame {

     private ServerSocket server;
     private Socket socket;
     BufferedReader reader;
     private JTextArea ta= new JTextArea();//多行输入
     private JTextField tf =new JTextField();//单行输入
     Container cc;
     private PrintWriter writer;


     SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");


    public MyServer(){
        setTitle("Send message to Client");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        cc=this.getContentPane();
        final JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        scrollPane.setViewportView(ta);
        cc.add(tf,"South");

        tf.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //绑定事件
                writer.println(tf.getText());
                ta.append("Server: "+sd.format(new Date())+"\n");
                ta.append(tf.getText()+'\n');
                ta.setSelectionEnd(ta.getText().length());
                tf.setText("");
            }
        });
        setResizable(false);
    }

   public void  getServer(){
       try {
           server = new ServerSocket(2190);
           ta.append("Server is successfully running!\n");

           while(true){
               ta.append("waiting for Client!\n");
               socket = server.accept();
               ta.append("Client: "+socket.getInetAddress()+" is connected!\n");
               writer = new PrintWriter(socket.getOutputStream(),true);
               reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                  getClientMessage();
           }

       } catch (IOException e) {
           e.printStackTrace();
       }


   }

    private void getClientMessage() {
       try{
           while(true) {
               ta.append("Client:" +sd.format(new Date())+"\n"+reader.readLine()+"\n");
           }
         }catch (Exception e) {
               e.printStackTrace();
           }

           try{
               if (reader != null) {
                   reader.close();
               }
               if (socket != null){
                   socket.close();
               }
           }catch (IOException e){
               e.printStackTrace();
           }

       }



    public static void main(String[] args) {
        MyServer ms = new MyServer();
        ms.setSize(500,480);
        ms.setVisible(true);
        ms.getServer();
    }


    }

客户端:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.*;
import javax.swing.border.*;

public class MyClient extends JFrame{

    BufferedReader reader;
    private JTextArea ta= new JTextArea();;//多行输入
    private JTextField tf=new JTextField();//单行输入
    private static final long serialVersionUID = 1L;
    private PrintWriter writer;
    Socket socket;

    Container cc;

    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");

    public MyClient(String title){
        super(title);


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        cc=this.getContentPane();
        final JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
        getContentPane().add(scrollPane,BorderLayout.CENTER);
        scrollPane.setViewportView(ta);
        cc.add(tf,"South");

        tf.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //绑定事件
                writer.println(tf.getText());
                ta.append("Client: "+sd.format(new Date())+"\n");
                ta.append(tf.getText()+'\n');
                ta.setSelectionEnd(ta.getText().length());
                tf.setText("");
            }
        });

    }

    public void connect(){
        ta.append("try to connect!\n");
        try {
            socket = new Socket("127.0.0.1",2190);
            ta.append("Complete connection!\n");

            while(true){
                writer = new PrintWriter(socket.getOutputStream(),true);
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                getServerMessage();

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

     public void getServerMessage() {
        try{
            while(true) {
                ta.append("Server: " +sd.format(new Date())+"\n"+reader.readLine()+"\n");
            }
        }catch (Exception e) {
            e.printStackTrace();
        }

        try{
            if (reader != null) {
                reader.close();
            }
            if (socket != null){
                socket.close();
            }
        }catch (IOException e){
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {

        MyClient client = new MyClient("Send message to Server");
        client.setVisible(true);
        client.setResizable(false);
        client.setSize(500,480);
        client.connect();


    }

}
登录界面:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class LoadingFrame extends JFrame implements ActionListener {

    private JLabel j1;
    private JLabel j2;
    private JTextField UsernameInput;
    private JPasswordField jpf;
    private Container cc;
    private JButton load;

   public LoadingFrame(){

       setSize(480, 500);
       setTitle("Loading Frame");

       cc = this.getContentPane();
       cc.setBackground(Color.white);
       cc.setLayout(new GridLayout(3, 1));

       j1 = new JLabel();
       j1.setText("UserName:");
       UsernameInput = new JTextField(15);
       JPanel jp1 = new JPanel();
       jp1.add(j1);
       jp1.add(UsernameInput);
       cc.add(jp1);

       j2 = new JLabel();
       j2.setText("PassWord:");
       jpf = new JPasswordField(15);
       jpf.setEchoChar('*');
       JPanel jp2 = new JPanel();
       jp2.add(j2);
       jp2.add(jpf);
       cc.add(jp2);

       load = new JButton("Log in");
       cc.add(load);

       load.addActionListener(this);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setResizable(false);
       setVisible(true);
   }

    public void actionPerformed(ActionEvent e) {
       if("admin".trim().equals(UsernameInput.getText())&&"login".trim().equals(new String(jpf.getPassword()))){
           MyClient client=new MyClient("Send message to Server");
           setVisible(false);
           client.setSize(500,480);
           client.setResizable(false);
           client.setVisible(true);
           client.connect();



       }else{
           System.out.println("Wrong password!");
       }
    }



    public static void main(String[] args) {
        LoadingFrame ljf= new LoadingFrame();

    }


}
  • 写回答

1条回答 默认 最新

  • 关注

    你这个程序有点问题,要启动线程处理,因为一启动就进入死循环接收信息了,所以相当于卡死了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月20日
  • 已采纳回答 9月12日
  • 创建了问题 9月12日

悬赏问题

  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行