在渲染/绘制事件期间显示模态对话框会导致UI工件

时间:2016-02-26 10:25:33

标签: java swing user-interface modal-dialog

如标题所示:
有时我在swing应用程序中有UI工件,当显示模式对话框时。

以下情况:

JTable -> getCellRendererComponent(...)

//This (simplified) method is called by JTable, to get a cell renderer.
private Component getCellRendererComponent(JTable srcTable, int row, int col, ...)
{
   MyService svc = new MyService();
   svc.doServiceCall(); // this causes a Modal-(Please wait/Progress)-Dialog to appear, until the call is finished!
   ...
   ...
   return component;
}

调用getCellRendererComponent(...)时,也可能在此方法中进行服务调用 当此服务调用使用模态(请等待/进度)-dialog时,UI-Artifacts将经常出现(UI未正确绘制,缺少/未绘制部件)。

当服务调用配置为不显示进度对话框(只是等待/阻止事件 - 调度 - 线程)时,不会出现UI工件(UI被绘制正确)。

我假设以下问题:
当表的某些部分应该重新绘制时,会调用getCellRendererComponent() 这意味着,重绘事件(在我的应用程序中)可以导致服务调用(显示临时模式对话框) 但是在显示模态对话框时,仍会处理一些ui事件(例如re-paint() - >这会导致另一个服务调用)。

我认为它与Swing和Thread-Safety有关。 (我知道,swing不是线程安全的。)

问题:
可能是什么原因以及如何识别/检测这种情况(因此我可以将服务配置为不显示进度对话框)?

修改:
首先,感谢所有回复。 通过这样做我了解所有的抱怨,但问题是应用程序非常庞大,开发人员很少。我不能轻易避免它。

请不要坚持使用服务电话! (当然,你不应该在paint-event中调用WebService !!)

归结为问题的是,getCellRendererComponent()还用于将Tables-CellRenderer-Component用于其他地方的其他目的。所以不明显,这个调用origin来自paint-event。 此外,并不总是显而易见的是,一个简单的方法调用(例如getCurrentTime()可能调用web服务(这会导致模式对话)。

简化示例:
getCellRendererComponent()正在调用getCurrentUser()。 但getCurrentUser()在其他地方被覆盖,因此,getCurrentUser()现在也会调用getCurrentTime()(调用服务方法)。 这意味着,getCellRendererComponent()不直接调用WebService。

也许除了检查堆栈跟踪(获取原点)之外别无选择。

0 个答案:

没有答案