Dispose JavaFX Tasks

Peter Penzov

I have a static BorderPane with ContextMenu insight Task

Task task = new Task()
        {
            @Override
            protected Void call() throws Exception
            {

                Platform.runLater(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        try
                        {
                            contextMenu = new ContextMenu();
                            MenuItem item1 = new MenuItem("About");
                            item1.setOnAction(new EventHandler<ActionEvent>()
                            {
                                @Override
                                public void handle(ActionEvent e)
                                {
                                    System.out.println("About");
                                }
                            });
                            MenuItem item2 = new MenuItem("Preferences");
                            item2.setOnAction(new EventHandler<ActionEvent>()
                            {
                                @Override
                                public void handle(ActionEvent e)
                                {
                                    System.out.println("Preferences");
                                }
                            });
                            MenuItem item3 = new MenuItem("Close");
                            item3.setOnAction(new EventHandler<ActionEvent>()
                            {
                                @Override
                                public void handle(ActionEvent e)
                                {

                                }
                            });
                            contextMenu.getItems().addAll(item1, item2, item3);

                            bp.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>()
                            {
                                @Override
                                public void handle(ContextMenuEvent event)
                                {

                                    contextMenu.show(bp, event.getScreenX(), event.getScreenY());
                                    event.consume();
                                }
                            });

                            bp.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>()
                            {
                                @Override
                                public void handle(MouseEvent event)
                                {
                                    contextMenu.hide();
                                }
                            });


                        }
                        catch (Exception ex)
                        {

                            ex.printStackTrace();
                        }
                        finally
                        {

                        }
                    }
                });

                return null;
            }
        };

        new Thread(task).start();

I noticed that when I close the component which holds the BorderPane the Java Threads are not disposed they are still initialized into the memory. I'm not sure is this caused by the static BorderPane. After the Task is completed the Java Thread should be disposed. Any idea why is this happening?

Sergey Grinev

The problem is not a Task, but the anonymous classes in your Runnable.

In the next piece of code:

bp.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>()
    {
         @Override
         public void handle(ContextMenuEvent event) {
             //...
         }
    });

you introduce an anonymous class extending EventHandler which holds inner link to a Runnable. To solve that you can use nested static class instead.

P.S.: Unfortunately you can't make anonymous class static in Java, see Is it possible to make anonymous inner classes in Java static?

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related