如标题所示:
有时我在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。
也许除了检查堆栈跟踪(获取原点)之外别无选择。