zoukankan      html  css  js  c++  java
  • invokeAndWait for JavaFX

    http://www.guigarage.com/2013/01/invokeandwait-for-javafx/

    ——————————————————————————————————————————————————

    Swing offers the two methods SwingUtilities.invokeAndWait(…) and SwingUtilities.invokeLater(…) to execute a Runnable object on Swings event dispatching thread. You can read more about this methods here.

    As I currently know JavaFX provides only Platform.runLater(…) that is the equivalent of SwingUtilities.invokeLater(…). A “runAndWait” method doesn’t exist at the moment. While developing some DataFX stuff and my first Raspberry Pi demo I needed this feature in JavaFX. So I created a runAndWait method that will hopefully be part of DataFX in some future. Until then you can use this code in your project:

    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
     
    import javafx.application.Platform;
     
    /**
     * General JavaFX utilities
     *
     * @author hendrikebbers
     *
     */
    public class FXUtilities {
     
        /**
         * Simple helper class.
         *
         * @author hendrikebbers
         *
         */
        private static class ThrowableWrapper {
            Throwable t;
        }
     
        /**
         * Invokes a Runnable in JFX Thread and waits while it's finished. Like
         * SwingUtilities.invokeAndWait does for EDT.
         *
         * @param run
         *            The Runnable that has to be called on JFX thread.
         * @throws InterruptedException
         *             f the execution is interrupted.
         * @throws ExecutionException
         *             If a exception is occurred in the run method of the Runnable
         */
        public static void runAndWait(final Runnable run)
                throws InterruptedException, ExecutionException {
            if (Platform.isFxApplicationThread()) {
                try {
                    run.run();
                } catch (Exception e) {
                    throw new ExecutionException(e);
                }
            } else {
                final Lock lock = new ReentrantLock();
                final Condition condition = lock.newCondition();
                final ThrowableWrapper throwableWrapper = new ThrowableWrapper();
                lock.lock();
                try {
                    Platform.runLater(new Runnable() {
     
                        @Override
                        public void run() {
                            lock.lock();
                            try {
                                run.run();
                            } catch (Throwable e) {
                                throwableWrapper.t = e;
                            } finally {
                                try {
                                    condition.signal();
                                } finally {
                                    lock.unlock();
                                }
                            }
                        }
                    });
                    condition.await();
                    if (throwableWrapper.t != null) {
                        throw new ExecutionException(throwableWrapper.t);
                    }
                } finally {
                    lock.unlock();
                }
            }
        }
    }

    It’s working for all my needs. Please give me some feedback if there are any problems or bug.

    ——————————————————————————————————————————————————

    回帖略。。。

    ——————————————————————————————————
    傲轩游戏网
  • 相关阅读:
    Docker 0x05: Dockerfile制作镜像
    Docker 0x04: Docker 基本使用
    Docker 0x03:Install Docker
    Docker 0x02: Docker生态
    Docker 0x01:Docker Container容器技术
    Axios发送AJAX请求
    Django学习之十三:提高页面开发效率减少冗余的模板系统
    javascript获取指定区间范围随机数
    完美解决eclipse编辑器中文字符过小问题
    mysql查询表所有列名,并用逗号分隔
  • 原文地址:https://www.cnblogs.com/cuizhf/p/2865882.html
Copyright © 2011-2022 走看看