2015-07-14 4 views
-1

Итак, я пытаюсь сделать программу типа чата с помощью JavaFX для графического интерфейса. У меня это так, что класс, который действует как сервер, будет зацикливаться и продолжать добавлять к нему клиентские соединения.JavaFX 8 метод инициализации

public void serverconnection() 
{ 
    // portnumber was saved from constructor 
    try (ServerSocket socket = new ServerSocket(this.portnumber)) 
    { 
     // loop is a bool set to true 
     while (loop) 
     { 
      // this class extends Thread and has its own overwritten start method 
      new myclass(socket.accept()).start(); 
     } 
    } 
    catch (IOException e) 
    { 
     System.exit(404); 
    } 
} 

так что проблема (я предполагаю) был, этот цикл продолжает цикл до тех пор, пока программа не закрывается. но так как я звала это в методе Инициализировать JavaFX в

public void initialize(URL url, ResourceBundle rb) 
{ 
    // constructor, nothing here is needed for this post 
    myclass z = new myclass(45234); 
    // problem here, since this has a loop, but 
    z.serverconnection(); 
    // gui wont load till after this is done 
    // but serverconnection is only done after program ends 
}  

проблема с этим не, по-видимому, GUI не будет загрузить только после инициализации закончена, но она не будет завершена, пока программа не закроется. После поиска в Google я не смог найти никаких исправлений. Мне нужен способ вызова метода, который будет делать все это, ПОСЛЕ завершения процедуры инициализации. Мой клиентский класс похож на этот, но методы для подключения к ним активируются при событиях при нажатии кнопки входа в систему. Для этого serveride один, я пытаюсь начать без какого-либо взаимодействия с пользователем. так есть способ вызова метода или выполнения этой работы ПОСЛЕ инициализации метода?

+0

Рассматривали ли вы добавление кнопки в пользовательском интерфейсе, щелчок по которой вызовет этот метод? – NaveenBharadwaj

+0

@NaveenBharadwaj Я хотел попытаться избежать этого, но если их нет другого пути, я добавлю один –

+0

Используя функцию параллелизма Java FutureTask, вы можете выполнять задачи позже. Посмотрите, работает ли это для вас. Если это не так, вам нужно разрешить инициализировать(). Таким образом, добавление кнопки станет необходимым. – NaveenBharadwaj

ответ

1

Вы можете запустить этот цикл в потоке, так что-то вроде

Thread t = new Thread(z::serverconnection) 
t.start() 

Если вы сделаете это в конце вашего метода initialization(), он будет работать именно тогда.

Это начнет тему, которая будет работать вечно; вам может понадобиться добавить функцию для прерывания потока, когда программа должна быть завершена.

Помните, что для изменения чего-либо в графическом интерфейсе вам необходимо выполнить задачу с помощью Platform.runLater(). Это связано с тем, что GUI может быть изменен только внутри одного потока. Поэтому, чтобы модифицировать что-либо, вы должны обернуть это в Runnable и отправить его на исполнение.

Вы можете сделать это таким образом:

Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
     doWhateverNeedsToBeDone(); 
    } 
}); 

В Java 8, вы можете сделать что-либо из следующих действий, в зависимости от степени работы предстоит сделать:

Platform.runLater(() -> { 
    doWhateverNeedsToBeDone(); 
}); 
Platform.runLater(() -> doWhateverNeedsToBeDone()); 
Platform.runLater(this::doWhateverNeedsToBeDone); 

последний работает только в том случае, если doWhateverNeedsToBeDone() является методом this.

+0

Я добавил информацию, пожалуйста, взгляните и скажите мне, если ваш ответ все еще действителен, тогда я могу дать ему попробовать :), также, спасибо! @glglgl –

+0

@TannerSummers В вашем вопросе ничего существенного не изменилось, поэтому ответ по-прежнему сохраняется. Поток запускается «в фоновом режиме» ... – glglgl

+0

Не забывайте, что если вы хотите изменить gui, когда фоновая задача выполнена, не делайте этого непосредственно в этом потоке, но оберните его в 'Application.invokeLater()' –

Смежные вопросы