【问题标题】:Java SWT control modified doesn't changeJava SWT 控件修改不变
【发布时间】:2012-12-23 05:55:36
【问题描述】:

我正在为聊天制作几个程序:服务器和客户端。

它们都有一个用 SWT 制作的 GUI。服务器总是运行良好。

另一方面,客户端的 GUI 没有。当我连接到服务器时,客户端询问已连接的客户端,服务器用 X 消息回答,每个名称都有一条。我已经检查过服务器确实发送了名称并且客户端接收了它们。

但是,即使我收到了这些消息,有时 GUI 也会显示它们,而有时则不会。即使在同一次执行中,有些名称可以放入 GUI 中,有些则不能。

我认为这可能是SWT的问题,尤其是关于修改GUI的方法。

正如您所料,我正在使用线程,甚至修改 GUI。因为我想从线程修改 GUI,所以我必须使用方法“Display.asyncExec”,所以每次我对 GUI 进行更改时,我都会这样做:

OurDisplay.asyncExec( new Runnable() {

    public void run()
    {

        MyText.append("#The user " + OurName + " has asked us about other clients\n");

    }

});

我不知道问题出在哪里,因为服务器使用相同但运行良好。

也许我会注意到,在主程序(服务器和客户端)中,我正在使用其他代码,以便在关闭正在使用的窗口(Shell)之前不完成程序执行:

while (!ServerShell.isDisposed())
{
    if (!ourDisplay.readAndDispatch())
        ourDisplay.sleep();
}

有什么想法吗?

谢谢

- 编辑 - 回复评论 nº1 -(我无法回复评论,我不知道为什么)

我没有。我已经尝试使用“syncExec”方法,以便让我的线程等待 GUI 的修改。但是,这都不起作用。

我不知道如何查看显示队列,我正在寻找它。感谢您的想法。

我将尝试捕获 Runnable 可能抛出的异常。我会报道新闻。

【问题讨论】:

  • 您是否尝试过设置断点/调试语句来确定 (a) Runnables 是否确实被放入了显示队列,以及 (b) Runnables 是否稍后执行(它们不是只是默默地抛出异常)?潜在的解决方案因该信息而异,它可能会帮助您缩小问题范围。

标签: java multithreading user-interface swt


【解决方案1】:

编一些try/catch,你会看到一个典型的问题: 尝试在忙碌时更新 GUI。 异常被压制,直到你让它撕裂。

我假设您那里有一个 Eclipse RCP 应用程序 - 对吧? 请使用 Eclipse 作业处理来更新 GUI (UIJob)。 这比那些 asyncExec(Runnable) 调用好几千倍,因为 Eclipse 框架会计算 GUI 更新的时间。

http://www.vogella.com/articles/EclipseJobs/article.html

Lars Vogel 有一个很棒的关于作业处理的教程。

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 2013-09-01
    • 2014-06-06
    • 2011-12-06
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多