【问题标题】:How to show items on a jList in java?如何在java中的jList上显示项目?
【发布时间】:2010-12-09 14:29:02
【问题描述】:

我制作了一个 java GUI 程序,并在该 GUI 上添加了一个 jList,以便通过调用添加项目来在该 jList 上打印程序的输出

listBox.addElement(""); // where listBox is an instance of jList

但问题是在添加时项目没有显示。当程序即将结束时,它们会显示出来。

意思是,我通过单击“开始”按钮启动程序,然后完成整个处理,包括将项目添加到“listBox”,但是当程序返回到“ “开始”按钮的 ActionListener 的 actionPerformed()" 方法。

可以做什么以便在项目添加到列表时立即显示它们。

上述应用程序是多线程的。主线程启动 GUI,然后启动 10 个线程并将 jList 的“listModel”(DefaultListModel 的实例)传递给所有线程,以便每个线程可以通过调用“addElement(”“)”方法将项目添加到列表中“列表模型”

实际上,listModel 是 DefaultListModel 类的子类(DefaultListModelSubClass)的一个实例。我已经重写了 addElement() 方法以使其“同步”,这样一次只有一个线程可以向其中添加一个项目。

【问题讨论】:

    标签: java user-interface jlist


    【解决方案1】:

    您可能正尝试在处理 GUI 更新的线程 Event Dispatching Thread 中进行处理。您的处理正在锁定 GUI 更新,然后在处理完成时,适当的 GUI 更改会传播。要使其工作,您需要在单独的线程中执行您的处理,并在必要时与EVT 通信。如果您有可用的 Java 6,SwingWorker 将是执行此操作的最佳方式。

    【讨论】:

    • J2SE 5.0 在一周内达到使用寿命。我希望没有太多的新代码可以使用它。
    • 我曾开发过运行 1.4 的旧版 Java 应用程序。我知道这很糟糕,但事实就是这样。
    【解决方案2】:

    所有事件的重绘和处理都在 AWT 事件调度线程 (EDT) 上完成。如果不是这种情况,那么您将通过处理多线程来处理,这对于 GUI 来说不是很实用。

    解决方案是在另一个线程中运行您的阻塞处理。通过在 EDT 上使用 java.awt.EventQueue.invokeLater 执行代码来更新 GUI。由于这是多线程的,因此您需要非常小心。特别是常见的建议是更喜欢在线程之间传输的对象的不变性,以避免必须锁定。也使用少量宽锁而不是大量小锁,但仍要小心回调。

    避免SwingWorker。它使演示变得简短。但是,对于生产代码,它会强制 GUI 和非 GUI 紧密耦合的设计。

    【讨论】:

    • 是的,应用程序是多线程的。我已经更新了我的问题。请看一下。
    【解决方案3】:

    这就是发生的事情

    点击 | -----> 动作执行 | ----------------> 填写清单 |对于每个项目 --------------------> jlist.addElement() | ----------------> 绘制 jlist

    当列表的填充结束时,您间接调用了paint方法。

    如果您想在此之前获得结果,则必须在向列表添加元素时绘制列表。

    使用 Stefan Kendall 提到的 SwingWorker 将允许您执行此操作。

    一般而言,您所做的是同时使用另一个线程来“填充”列表,它不时告诉“绘画”线程更新 gui

    点击 | -----> 动作执行 | ----------------> 填写清单 |对于每个项目 --------------------> jlist.addElement() | | (在其他线程中) ----> 绘制列表(到目前为止的元素) | ----------------> 绘制 jlist

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 2013-03-26
      • 2015-05-19
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多