为什么readline()会阻止JButton Action Listener中的先前代码?

时间:2018-11-04 21:17:49

标签: java swing bufferedreader readline event-dispatch-thread

当我在客户端上单击按钮时,我正在尝试从服务器读取数据。

问题在于,当我单击有readLine()的按钮时,此指令不仅会阻止其后的代码(如我预期的那样),还会阻止先前的代码。

不要诅咒我,但是我正在为此项目使用NetBeans GUI Builder。

发生这种情况的动作监听器有两个,这是客户端之一:

private void buyTicketButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                
        try {
            spawnLabel.setIcon(new javax.swing.ImageIcon(getClass().
                    getResource("/giocatore/ticketGreen.png")));
            buyTicketButton.setEnabled(false);
            ArrayList<Integer> table = new ArrayList();
            //Adds numbers 1 to 90 to the array
            for (int i = 1; i<=90; i++){
                table.add(i);
            }

            //Shuffles the array randomly
            Collections.shuffle(table);

            for(int i = 0; i<15; i++){
                nums.get(i).setText(Integer.toString(table.get(i)));
            }

            out.println("ready");

            while((read = in.readLine())!=null){
               //read = in.readLine();
               System.out.println(read);
            }

        } catch (IOException ex) {
            Logger.getLogger(Giocatore.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 

此按钮的作用是:

  • 更改标签图标
  • 禁用按钮
  • 创建并填充一个名为“表”的ArrayList
  • 随机排列数组
  • 将前15个数字打印到ArrayList中名为“ nums”的15个JTextField中。
  • 使用名为“ out”的PrintWriter将消息发送到服务器
  • 虽然有一些要读取的内容,请使用名为“ in”的BuffereadReader进行读取

真正发生的是,程序被readLine()命令阻塞,而之前发生的所有事情都被忽略了,因为out.println(“ ready”);到达服务器。

为什么会这样?有什么办法可以解决?

编辑:使用swingworker解决

0 个答案:

没有答案