使用while循环和Executor时,JFrame不会出现

时间:2017-05-17 11:29:53

标签: java swing

这是我在这里发表的第一篇文章。我已经找到了答案,而我发现的答案并没有帮助我。 我想使用FutureTask运行一个简单的TCP服务器。 它应该等待客户端,直到按下按钮并且执行器停止。 我的窗口应用程序仅在我不使用while循环时出现。

有人可以帮我吗?

import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class Main {

  public static void main(String[] args) throws InterruptedException {

   ExecutorService pool = Executors.newFixedThreadPool(2);
   TCPServer tcpServer = new TCPServer(15002, true);
   FutureTask<Integer> ft = new FutureTask<>(tcpServer);
   pool.execute(ft);

   final JFrame frame = new JFrame("TCP Server");
   final JLabel print = new JLabel("Program is executing!");
   final JToggleButton switchButton = new JToggleButton("Cancel");
   final JLabel status = new JLabel("Waiting for connection");
   int i = 0;
   while (!switchButton.isSelected() && !ft.isDone()) {
     i++;
     String temp = "Waiting for connection... " + i + " s.";
     status.setText(temp);
     int sleep = i*1000;
     Thread.sleep(sleep);
   }
  switchButton.addItemListener(new ItemListener() {
  @Override
  public void itemStateChanged(ItemEvent e) {
    if(e.getStateChange()==ItemEvent.SELECTED){
      status.setText("Cancelled");
      pool.shutdown();
    }
   }
 });
 frame.getContentPane().add(print, BorderLayout.NORTH);
 frame.getContentPane().add(switchButton, BorderLayout.CENTER);
 frame.getContentPane().add(status, BorderLayout.SOUTH);
 frame.pack();
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 frame.setVisible(true);
 }
}

1 个答案:

答案 0 :(得分:0)

因为在调用frame.setVisible(true);

之前等待连接

您需要重新排序初始化,如:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class Main {

    public static void main(String[] args) throws InterruptedException {

        ExecutorService pool = Executors.newFixedThreadPool(2);
        TCPServer tcpServer = new TCPServer(15002, true);
        FutureTask<Integer> ft = new FutureTask<>(tcpServer);
        pool.execute(ft);

        final JFrame frame = new JFrame("TCP Server");
        final JLabel print = new JLabel("Program is executing!");
        final JToggleButton switchButton = new JToggleButton("Cancel");
        final JLabel status = new JLabel("Waiting for connection");
        switchButton.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    status.setText("Cancelled");
                    pool.shutdown();
                }
            }
        });

        frame.getContentPane().add(print, BorderLayout.NORTH);
        frame.getContentPane().add(switchButton, BorderLayout.CENTER);
        frame.getContentPane().add(status, BorderLayout.SOUTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        int i = 0;
        while (!switchButton.isSelected() && !ft.isDone()) {
            i++;
            String temp = "Waiting for connection... " + i + " s.";
            status.setText(temp);
            int sleep = i * 1000;
            Thread.sleep(sleep);
        }

    }
}