代码之家  ›  专栏  ›  技术社区  ›  poke

与Swing同步:等待UI

  •  2
  • poke  · 技术社区  · 14 年前

    通常情况下,一个人正在寻找一种方法来更新用户界面,而背景中的某些东西仍在工作。我的方法是要么使用一个新线程,要么简单地使用 SwingUtilities.invokeLater .

    然而,现在我的处境完全相反。我有一个按钮,它调用一个静态方法,这个方法有一些魔力(这里不重要)。按下该按钮还会在UI线程上启动动画(当前使用Swing计时器实现)。当magic方法完成时,它首先向UI触发一个事件,然后继续执行其他操作。事件告诉UI停止动画-经过一段时间的延迟(实际上UI应该在短时间内显示不同的动画)。

    让后台进程等待UI的正确方法是什么?

    编辑

    下面的代码显示了非常简单的情况。UI只是实际的监听器之一(尽管是唯一的阻塞监听器),所以我更希望在事件处理的UI端有一些阻塞效果。

    public class Worker
    {
        public static void magicMethod()
        {
            // do something
            // ...
    
            // fire event
            for ( ExampleEventListener listener : listeners )
                listener.onExampleEvent( new ExampleEvent() );
    
            // BLOCK until animation in UI completed
            nextStep();
        }
    
        public static void nextStep ()
        {
            // continue work
        }
    }
    
    
    public class MyWindow extends JFrame implements ExampleEventListener
    {
        public void actionPerformed ( ActionEvent event )
        {
            // button clicked
            Worker.magicMethod();
        }
    
        public void onExampleEvent ( ExampleEvent event )
        {
            startAsynchronousAnimation();
        }
    
        private void completeAnimation ()
        {
            // animation completed
            animationPanel.setVisible( false );
    
            // UNLOCK
        }
    }
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Ultimate Gobblement    14 年前

    不确定这是否是最好的方法,但是您可以使用一个共享的布尔值来表示后台进程是否准备好继续。使用wait()将导致线程释放同步块中对象的锁。比如:

    while(! ready){
        try{
            mySynchonizedObject.wait(); 
        }catch(InterruptedException ex){
            System.exit(1);
        }
    }
    

    其中“ready”是共享布尔值。当用户界面准备就绪时,它会将ready设置为true并调用notifyAll()。

        2
  •  0
  •   Nate W.    14 年前