Показать этап перед инициализацией контроллера в JavaFx - PullRequest
0 голосов
/ 04 декабря 2018

Я сделал этот сервер, который работает, но показывает себя только тогда, когда клиент пытается установить соединение.Если я выполню его в одиночку, он ничего не показывает.Это основной файл:

public class Server extends Application {

@Override
public void start(Stage stage) throws Exception {
    FXMLLoader sLoader = new FXMLLoader(getClass().getResource("server.fxml"));

    BorderPane root = new BorderPane(sLoader.load());

    ServerController sController = sLoader.getController();

    Scene scene = new Scene(root);
    stage.setScene(scene);
    stage.show();
    sController.initModel();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

И это его контроллер:

public class ServerController {

@FXML
private TextArea textarea;

public void initModel() {
    try {
        int i = 1;
        ServerSocket s = new ServerSocket(5000);
        //while (true) {
        Socket incoming = s.accept(); //is waiting for connections
        textarea.setText("Waiting for connections");
        Runnable r = new ThreadedEchoHandler(incoming, i);
        new Thread(r).start();
        i++;
        //}
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class ThreadedEchoHandler implements Runnable {

    private Socket incoming;
    private int counter;

    /**
     * Constructs a handler.
     *
     * @param i the incoming socket
     * @param c the counter for the handlers (used in prompts)
     */
    public ThreadedEchoHandler(Socket in, int c) {
        incoming = in;
        counter = c;
    }

    public void run() {
        textarea.setText("Connected from: " + incoming.getLocalAddress());
        String nomeAccount = "";
        try {
            //PHASE 1: The server receives the email
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
                nomeAccount = in.readLine();
            } catch (IOException ex) {
                System.out.println("Not works");
            }

            //PHASE 2: I'm getting all the emails from the files
            File dir = new File("src/server/" + nomeAccount);
            String[] tmp = new String[100];
            int i = 0;
            for (File file : dir.listFiles()) {
                if (file.isFile() && !(file.getName().equals(".DS_Store"))) {
                    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
                        String line;
                        while ((line = br.readLine()) != null) {
                            tmp[i++] = line;
                        }
                    } catch (IOException ex) {
                        System.out.println("Cannot read from file");
                    }
                }
            }

            //PHASE 3: The server sends the ArrayList to the client
            PrintWriter out = new PrintWriter(incoming.getOutputStream(), true);
            for (int j = 0; j < i; j++) 
                out.println(tmp[j]); // send the strings name to client
        } catch (IOException ex) {
            System.out.println("Cannot send the strings to the client");
        } finally {
            try {
                incoming.close();
            } catch (IOException ex) {
                System.out.println("Cannot closing the socket");
            }
        }
    }
}
}

Я пытаюсь следовать шаблону MVC и не знаю, должен ли я отделитьчасть, где я жду соединения от метода инициализации.РЕДАКТИРОВАТЬ: textarea.setText("Waiting for connections"); также не работает, я думаю, потому что текстовая область еще не существует, когда компилятор достигает этой части

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...