在我的应用程序中(由于this帖子在托盘上运行)我有一个与Socket等待通信的线程。
收到后,我需要打开一个窗口来显示信息。可能会出现多个“事件”,因此我需要使用新事件更新窗口(如果已经打开)。
要做到这一点,我无法使用右键单击托盘并选择某个操作时将打开的“正常”阶段,因为“事件”屏幕不依赖于托盘图标操作。 Trayicon有主要应用程序(有设置等),而事件屏幕只需要显示事件。
问题是:
现在,当我设置托盘图标时,我会这样做:
Platform.runLater(TrayIconManager::createEventStage); // Create the stage for events
Injector injector = Guice.createInjector(new AppGuiceModule()); // I've tried this to share the list, but dont works..
EventsReceiverTask task = new EventsReceiverTask();
injector.injectMembers(task);
Platform.runLater(task);
以这种方式创建阶段(在静态TrayIconManager类中):
private static void createEventStage() {
eventStage = new Stage();
NotificationView view = new NotificationView();
Scene scene = new Scene(view.getView());
eventStage.setScene(scene);
// Just create the stage and scene, not show it
}
NotificationPresenter(带加力燃烧室):
@Inject
EventsDAO eventsDao;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
eventsDao.events().addListener(new ListChangeListener<ScheduledEvent>(){
@Override
public void onChanged(ListChangeListener.Change<? extends ScheduledEvent> c) {
System.out.println("Notified me!");
}
});
}
最后是任务,在我收到通知后,我正在尝试添加到EventsDAO:
@Override
public void run() {
while (true) {
Socket receiver;
try {
receiver = serverSocket.accept();
.......
eventsDao.addEvent(scheduledEvent);
.....
因为JavaFX需要在自己的线程中执行,我需要多次使用Platform.runLater,一次初始化阶段,另一次初始化线程(使用observableArrayList())