且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

上下文菜单洞察JavaFX任务

更新时间:2023-08-31 21:28:58

考虑以下代码,从任务创建上下文菜单。如果你摆脱了闩锁,在请求id时就不会构造上下文菜单。

Consider the following code which creates a context menu from task. If you get rid of the latch the context menu wont be constructed at the time when its id is requested.

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.scene.control.Button;
import javafx.scene.control.ContextMenu;
import javafx.stage.Stage;

import java.util.concurrent.CountDownLatch;

public class InitThreadTest extends Application {

    static private StringBuilder stringBuilder = new StringBuilder();

    private ContextMenu contextMenu;
    private CountDownLatch menuCreated = new CountDownLatch(1);

    static synchronized void writeString(String s) {
        stringBuilder.append(s).append("\n");
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override public void init() throws Exception {
        new Button();

        Task task = new Task() {
            @Override
            protected Void call() throws Exception {
                writeString("Task started");

                writeString(Thread.currentThread().getName() + " is fx thread: " +
                            Platform.isFxApplicationThread());

                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        writeString(Thread.currentThread().getName() + " is fx thread: " +
                                    Platform.isFxApplicationThread());
                        try {
                            contextMenu = new ContextMenu();
                            contextMenu.setId("Test ID");
                            writeString("Created context menu");
                            menuCreated.countDown();
                        } catch (Exception ex) {
                            writeString(ex.getMessage());
                            ex.printStackTrace();
                        } finally {
                            writeString("Test");
                        }
                    }
                });

                writeString("Task finished");
                return null;
            }
        };

        new Thread(task).start();

        menuCreated.await();

    }
    @Override public void start(Stage s) {

        System.out.println(stringBuilder.toString());
        System.out.println("Context menu is " + ((contextMenu == null) ? null : contextMenu.getId()));

        Platform.exit();
    }
}