Как получить JFrame и какое-то время l oop? - PullRequest
0 голосов
/ 20 марта 2020

Я хочу создать серверное и клиентское приложение в java с JFrame. Сервер должен всегда прислушиваться к клиенту, поэтому я сделал некоторое время l oop.

У меня есть кнопка запуска в коде фрейма, и когда я нажимаю на нее, сервер запускается с l oop, а затем фрейм не отвечает после нажатия кнопки, поэтому я не могу закрыть окно. Для этого мне пришлось открыть диспетчер задач.

Вот код сервера Java:

import java.net.*; 
import java.io.*; 

public class Host 
{ 
    public static String line = ""; 
    private Socket socket = null; 
    private ServerSocket server = null; 
    private DataInputStream in = null; 

    public Host(int port) 
    { 
        try
        { 
            server = new ServerSocket(port); 
            System.out.println("Server started"); 

            System.out.println("Waiting for a client ..."); 

            socket = server.accept(); 
            System.out.println("Client accepted"); 

            in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 

            while (!line.equals("/Disconnect client")) 
            { 
                if (Actions.start == true) {
                    try
                    { 
                        line = in.readUTF(); 
                        System.out.println(line);

                        if(Actions.alert == true) {
                            System.out.println(Actions.alertText);
                        }

                        if (Actions.prepare == true) {
                            System.exit(0);
                        }

                        if (line == "/clients") {
                            System.out.println(Actions.clientlist);
                        }

                    } 
                    catch(IOException i) 
                    { 
                        System.out.println(i); 
                    } 

                } 
            }
            System.out.println("Closing connection"); 

            socket.close(); 
            in.close(); 
        } 
        catch(IOException i) 
        { 
            System.out.println(i); 
        } 
    } 
} 

А вот код кадра:

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextField;

public class GUI {

    public static JFrame frame;
    public static JTextField textField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        //Host.loop();
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI window = new GUI();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public GUI() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {

        if (Actions.prepare == true) {
            System.exit(0);
        }

        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JButton btnNewButton = new JButton("STOP");
        btnNewButton.setBounds(10, 11, 89, 23);
        frame.getContentPane().add(btnNewButton);
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Actions.onEnd();
            }
        });

        textField = new JTextField();
        textField.setEditable(false);
        textField.setBounds(10, 45, 414, 205);
        frame.getContentPane().add(textField);
        textField.setColumns(10);

        JButton btnNewButton_1 = new JButton("ALERT");
        btnNewButton_1.setBounds(109, 11, 89, 23);
        frame.getContentPane().add(btnNewButton_1);

        JButton btnNewButton_2 = new JButton("START");
        btnNewButton_2.setBounds(208, 11, 89, 23);
        frame.getContentPane().add(btnNewButton_2);
        btnNewButton_2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Actions.onStart();
            }
        });

    }
}

Класс действий:

public class Actions {
    public static boolean start = false;
    public static boolean prepare = false;
    public static boolean alert = false;
    public static String[] clientlist;
    public static String alertText;
    public static boolean recieved = false;

    public static void onStart() {
        start = true;
        Host server = new Host(5000); 
    }

    public static void onEnd() {
        prepare = true;
        if (Actions.prepare == true) {
            System.exit(0);
        }
    }

    public static void onAlert() {
        alert = true;
    }
}
...