MainThread.join()时Java更新GUI?

时间:2015-10-02 22:29:03

标签: java multithreading swing event-dispatch-thread

我尝试将JLabel从位置A移动到位置B顺序在相同的X和Y步骤中..方法正常工作,但不会更新我的gui .. 我在下面向您展示我的代码:

当我不打电话给。join()方法时,代码可以正常工作,但不要等到我的另一个帖子执行......我需要这个功能不要当它实际运行时调用..任何人都可以帮助我吗?

Thread MoveThread = new Thread( new Runnable() 
    {

        @Override
        public void run() 
        {
            for (int i = 0; i<Const.SteinVerschiebenSchritte; i++) 
            {
                try
                {
                    p_lblToMove.setLocation(p_lblToMove.getLocation().x + x_schritt, p_lblToMove.getLocation().y + y_schritt);
                    System.out.println("SetLoc");
                    Thread.sleep(10);
                }
                catch (InterruptedException ex)
                {
                    StatusLog("InterruptedException");
                }
            }
            System.out.println("invokeLater");


            p_lblToMove.setLocation(p_lblToMove.getLocation().x + x_offset, p_lblToMove.getLocation().y + y_offset);
        }
    });



    MoveThread.start();
    try {
        System.out.println("BeforeJoin");
        MoveThread.join();
        System.out.println("AfterJoin");
        System.out.println("------------------");
    } catch (InterruptedException ex) {
        Logger.getLogger(Spielfeld.class.getName()).log(Level.SEVERE, null, ex);
    }

1 个答案:

答案 0 :(得分:2)

Swing是一个单线程环境,这意味着您不应该在Event Dispatching Thread的上下文中执行任何长时间运行或阻塞操作,同样,Swing也不是线程安全的,这意味着您应该只更新UI来自Event Dispatching Thread的上下文。

有关详细信息,请参阅Concurrency in Swing

根据您要实现的目标,您可以使用SwingWorker,有关详细信息,请参阅Worker Threads and SwingWorker,或使用Swing Timer,有关详细信息,请参阅How to use Swing Timers

还要记住,在定位和调整组件大小时,Swing依靠布局管理器来完成大部分核心工作,您可能会发现您正在与可能导致意外结果的布局管理器作斗争

当然,您可以随时查看The Universal Tween EngineSliding layoutJava: Moving jLabel twice using Timer