java - 在服务器停止之前 GUI 不会启动

标签 java user-interface client-server

我在启动 GUI 时遇到困难。它已连接到我的 ClientController。启动服务器后,我还启动了 ClientController,之后,我的 GUI 应该随之运行。但直到我停止我的服务器它才出现,然后它终于出现了。

public class ClientController {
    private HashMap<String, ArrayList<String>> drinkar = null;//Controller
    private ServerHandler serverH = new ServerHandler();
    private GUI gui = new GUI(this);

    public void searchDrinks(String jtf) {
        drinkar = serverH.drinksStartsWith(jtf);
        if(drinkar!=null) {
            gui.setDrinks(new ArrayList(drinkar.entrySet()));
            gui.setIngredients(new ArrayList());
        }
        System.out.println(drinkar);
    }

    public void drinkInformation(String drink) {
        ArrayList<String> result = drinkar.get(drink);
        if(result!=null) {
            gui.setIngredients(result);
        }
    }

    public static void main(String[] args) {
        ClientController controller = new ClientController();
    }
}

这是我的 GUI 类

public class GUI implements ActionListener {

private JFrame frame = new JFrame("Dryck & Ingrediens"); // GUI
private JTextField jtf = new JTextField();// GUI
private JTextArea jl1 = new JTextArea();// GUI
private JList jl = new JList();// GUI
private JButton b = new JButton("Sök");
private JScrollPane js = new JScrollPane(jl);// GUI
private JLabel lab = new JLabel("Ange dryck");//GUI
private JLabel lab1 = new JLabel("Walid Shams");
private JLabel lab2 = new JLabel("Kushtrim Brahimi");
private ClientController controller;
//    private HashMap<String, ArrayList<String>> drinkar = null;//Controller
//    private ServerHandler serverH = new ServerHandler();

public GUI(ClientController controller) {
    this.controller = controller;

    frame.getContentPane().setLayout(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(50, 300, 420, 400);
    frame.setResizable(false);
    frame.setVisible(true);
    js.add(jl);
    js.add(jl1);
    jl1.setEditable(false);
    lab.setBounds(90, 20, 130, 20);
    lab1.setBounds(300, 310, 130, 20);
    lab2.setBounds(300, 330, 130,20);
    jtf.setBounds(50, 40, 150, 40);
    b.setBounds(230, 40, 100, 40);
    jl.setBounds(50, 90, 150, 200);
    jl1.setBounds(210, 90, 150, 200);
    Container con = frame.getContentPane();
    con.setBackground(Color.cyan);


    jl.addListSelectionListener(new ListSelectionListener() {

        // sorterar ingredienserna för vald drink och skriver ut i textArea
        public void valueChanged(ListSelectionEvent e) {
             if (jl.getSelectedIndex() != -1) {
                 String item = (String) jl.getSelectedValue();
                 jl1.setText("");
//                     controller.drinkInformation(item);
             }else{
                 jl1.setText("");
             }
        }
    });
    frame.add(jtf);
    frame.add(jl);
    frame.add(jl1);
    frame.add(lab);
    frame.add(lab1);
    frame.add(lab2);
    frame.add(js);
    frame.add(b);

    b.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {
    if(e.getSource().equals(b)){
        if (jtf.getText().length() > 0) {
            controller.searchDrinks(jtf.getText());
        }
    }

}

public void setDrinks(ArrayList<String> drinks) {
    DefaultListModel model = new DefaultListModel();

    for(int i = 0; i < drinks.size(); i++){
        model.addElement(drinks.get(i));
    }
    jl.setModel(model);

}

public void setIngredients(ArrayList<String> ingredients) {

    for(String ingredient : ingredients){
        jl1.append(ingredient + "\n");
    }
}

}

最后是我的服务器

public class Server {

    private ServerSocket server;
    private Socket socket;
    private ObjectOutputStream oos;
    private DataOutputStream dos;
    private DataInputStream dis;
    private HashMap<String, ArrayList<String>> drinkar = new HashMap<String, ArrayList<String>>();
    private int port;

    public Server(int port){
        this.port = port;
        Thread connectThread = new Thread( new Connect() );
        connectThread.start();
    }

    // låter en klient koppla upp sig till servern
    private class Connect implements Runnable {
        public void run() {
            try {
                server = new ServerSocket(port);
                System.out.println("Server running");
                while (true) {
                    socket = server.accept();
                    Thread clientThread = new Thread( new TalkToClient( socket ) );
            clientThread.start();
                    System.out.println("someone connected");
                }
            } catch (IOException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                server.close();
            } catch( Exception e ) {}
        }
    }

    // sköter kommunikationen med klienter
    private class TalkToClient implements Runnable{
        private Socket socket;
        public TalkToClient( Socket socket ) {
            this.socket = socket;
        }
        public void run() {
            String clientMsg;
            try {
                dis = new DataInputStream(socket.getInputStream());
                while ((clientMsg = dis.readUTF()) != null) {
                    if (clientMsg.length() > 0) {
                        dos = new DataOutputStream(socket.getOutputStream());
                        dos.writeUTF("read");
                        drinkar = Mysql.getDrinks(clientMsg);
                        sendNames();
                    }
                }
            } catch (Exception e) {
                System.out.println(e);
            }

        }

    }

    // skickar med hashmapen med writeObject
    public void sendNames() {

        try {
            oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(drinkar);
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) {
        new Server(4444);
    }
}

最佳答案

我认为一定是 ServerHandler 代码中的问题。你能发布这个类的代码吗?当您将 GUI 的初始化放在 ServerHandler 之前会发生什么?

关于java - 在服务器停止之前 GUI 不会启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12111594/

相关文章:

java - 带有 Action 监听器的单选按钮

java - 程序仅读取.txt文件java中的最后一行

c++ - 在 QT Creator 中封装 UI 还是传递指向 UI 的指针更好?

android - Android xml 形状声明中的滑稽错误

java - 从 Windows 批处理文件调用 Apache Camel Spring Boot 应用程序

java - 根据前一行 JXTreeTable 中的值绘制单元格某些颜色

android - 使用productFlavors时不能继承自定义主题

java.util.NoSuchElementException : No line found error java

android - 一个简单的安卓客户端-服务器应用程序

client-server - 为什么服务器无法获取客户端MAC地址,如客户端IP?