2013-04-04 26 views
0

我正在使用invokeLater()加载位于JTabbedPane内的JPanel内的JEditPane内的HTML页面。确定invokeLater中的进程何时完成

我所有的方法都可以正常加载html。我遇到麻烦的事情是更新标签标题。

但是,方法setTitle()和setTabTitle()可以在PageLoader完成之前执行。因此标签标题总是显示前一个html页面的标题。

有没有一种方法可以让我从执行,直到调用后已经完成了内螺纹后停止方法的setTitle()和setTabTitle():

这里是我的代码我在看的部分:

private void showPage(){ 
    // Load cursors 
    Cursor cursor = viewer.getCursor(); 
    Cursor waitCursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR); 
    viewer.setCursor(waitCursor); 

    SwingUtilities.invokeLater(new PageLoader(viewer, url, cursor)); 

    //Update tab title 
    setTitle(); 
    tabPanel.setTabTitle(this); 

    //Update address bar 
    addressTextField.setText(url.toString()); 


} 

感谢您的任何帮助,你可以给。

+0

只是猜测没有看到PageLoader:如果是这样的长时间运行的任务,这是错的包裹这一切进入一个调用 - 而是启动一个线程来完成后台工作,并在该线程中调用invokelater将结果传递给EDT。这是更新相关UI属性的适当位置,如f.i.框架/标签标题 – kleopatra 2013-04-04 22:16:13

回答

1

setTitle()等放在PageLoader.run()代码的末尾。您可能需要将this或其他一些变量传递给它的构造函数,以便您可以访问标题。

+0

这会膨胀代码。不在PageLoader构造函数中,不得不设置标签标题。这就像在框架构造函数中调用'setVisible()'一样。 – 2013-04-04 16:40:08

+0

PageLoader构造函数不会设置标题,但是在PageLoader.run()结尾处,它将需要一些引用,以便它可以获取标题并对其进行设置。尽管我会澄清我的答案 - 谢谢。 – user949300 2013-04-04 17:06:04

+0

如果他调用'setTitle()',它以某种方式。 – 2013-04-04 17:09:38

2
Determining when a process within invokeLater has completed 
  • 可以通过if (SwingUtilities.isEventDispatchThread()) {util.Timer

  • 测试,但这种想法是不好的,为什么有理由狩猎EDT结束,

  • EDT在没有结束在Swing GUI中重绘所有事件的时刻,有通过API实现的通知器的内部处理

  • 基本上你模拟Workers Thread,使用SwingWorkerRunnable#Thread(所有事件visibble桂必须被包裹成的invokeLater)

相关问题