JavaFX 8 - 从线程打开多个窗口(使用afterburnerfx)

时间:2015-04-04 15:08:02

标签: javafx-8

在我的应用程序中(由于this帖子在托盘上运行)我有一个与Socket等待通信的线程。

收到后,我需要打开一个窗口来显示信息。可能会出现多个“事件”,因此我需要使用新事件更新窗口(如果已经打开)。

要做到这一点,我无法使用右键单击托盘并选择某个操作时将打开的“正常”阶段,因为“事件”屏幕不依赖于托盘图标操作。 Trayicon有主要应用程序(有设置等),而事件屏幕只需要显示事件。

问题是:

  • 具有Socket的“无限”线程如何在共享observableArrayList()上添加事件?
  • 当列表更改时,显示(如果尚未打开适当的阶段)消息或添加新消息。

现在,当我设置托盘图标时,我会这样做:

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())

0 个答案:

没有答案