【问题标题】:Get current instance of Runnable获取 Runnable 的当前实例
【发布时间】:2011-12-22 17:40:34
【问题描述】:

我正在制作一个允许用户查看存储在不同数据库中的任务列表的应用程序。所以发生的事情是,我有一个可浏览数据库的名称列表(存储为文本文件)。程序加载该列表中的第一个数据库并显示内容。然后从一个菜单中,我允许用户在列表中选择另一个数据库。 (有点像,我想查看 Andy 的任务,现在是 Bob,现在是 Carl...)。

问题是,我不知道如何更新 UI 以便显示新数据库的内容。删除当前列出的任务,从数据库中读取,然后重新填充是微不足道的。但是我无法访问此代码(来自我的 Singleton 数据库驱动程序),因为我需要访问已加载到 EventQueue 的 Runnable 实例(我的所有 JComponent 都是私有的,就像我迄今为止遇到的所有教程一样)。我正在查看 EventQueue 中的 get/peek 方法,但它们似乎不是我需要的,因为它们返回 AWTEvents,而且除了 java.lang.Object 之外,我没有看到 AWTEvent 和 Runnable 之间的任何关系。

那么,是否有可能获得当前的 Runnable?怎么样?

提前感谢您的任何指导。

【问题讨论】:

  • 我认为你可能会做错了。我认为没有必要尝试获取对“可运行”的引用。没有意义。您的 Swing GUI 不能访问数据库驱动程序代码吗?这不是从程序的控制类中调用的吗?

标签: java swing runnable eventqueue


【解决方案1】:

我怀疑你做错了。您要做的是从控制类中更改数据库(使用 MVC 命名法)。例如,假设您将可用数据库加载到 JList 中,然后在该组件的控件中,例如 ListSelectionListener,您执行一个 SwingWorker 来加载新数据库,然后通过其发布/进程对在 GUI 中显示结果方法或在 done 方法中。数据库代码(模型)应该对代码的视图或 GUI 部分(您称之为 Runnable)一无所知。

【讨论】:

  • 谢谢鳗鱼。在阅读了您(早期)对我的问题的评论后,我立即重新考虑,只是我花了很长时间才获得更清洁的解决方案。我将数据库类设为 Observable,然后将 Runnable 设为 Observer(当然,它会观察 DB 类!)。因此,每当数据库切换时,Runnable 都会收到通知并自行刷新。我不确定它是否是最干净的解决方法,但嘿它有效(至少目前还没有问题)。再次感谢您。
【解决方案2】:

有一个关于Concurency in Swing 的很好的教程,没有人能说出来,那已经过时了

你有两个选择

1) Runnable#Thread,但所有到 GUI 的输出都必须包装到 invokeLater(),更多详细信息请参阅关于 Concurency in Swing 的教程

2) 或使用SwingWorker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2013-09-07
    • 1970-01-01
    • 2023-02-14
    • 2022-10-05
    • 2015-01-12
    相关资源
    最近更新 更多