【问题标题】:Java JTabbedPane switch tab immediatelyJava JTabbedPane 立即切换选项卡
【发布时间】:2011-04-17 13:53:25
【问题描述】:

我有一个带有两个选项卡的简单 JTabbedPane 组件。当在其中一个选项卡上触发按钮事件时,我希望将当前视图设置为另一个选项卡立即。我可以在相关按钮的 actionPerformed 方法中使用 setSelectedIndex(int) 成功切换当前选项卡,但按钮事件的剩余功能有时可能需要一段时间才能完成。

似乎 setSelectedIndex(int) 更改不会立即发生,只有当按钮单击/按下触发的 actionPerformed 方法的主体完成时才会发生。

我想在单击/按下按钮时切换选项卡的原因是,用户可以在另一个选项卡的文本区域中看到一条消息,告诉他们“正在处理,请稍候”等,而其余的执行按钮单击功能。该功能的结果在到达时将替换“...请稍候”消息。

所以现在发生的事情是我单击按钮,它在该选项卡上冻结,直到按钮功能完全完成,然后它切换。所以“...请稍候”的消息实际上是从未见过的。

我不知道该怎么办。也许为“功能”创建一个新线程,并让按钮单击事件启动线程,以便按钮事件可以在等待结果时完成并切换选项卡。 只是大声思考。任何帮助表示赞赏。

-罗伯

【问题讨论】:

  • 您可能想要做的实际上是不同的:如果您考虑一下并查看复杂的应用程序(例如 IDE),您会发现它们通常不会打扰 “请稍候” 消息嵌入在每个选项卡/子选项卡/子屏幕/应用程序的任何内容中。他们所做的是放置一个可以从应用程序的任何部分看到的进度条,并从用户所在应用程序的任何“部分”更新该进度条。与某些浏览器始终显示的方式不同每个页面加载的 % 总是在同一个位置。在我看来,这是一个更好的设计。
  • 一个进度条会很棒,但我有点着急,我肯定没有时间来实现跟踪剩余时间。我明白你的意思,不过,当你说只是将消息放在应用程序的某个通用区域时,我可能会考虑。

标签: java swing jtabbedpane


【解决方案1】:

在我看来,您的线程问题比什么都重要,这会冻结您的 GUI,使其在完成之前完全无响应,从而延迟您的选项卡式窗格交换。如果您在您的操作执行方法中运行任何长时间运行的进程,请改为在后台线程中执行它们,例如由 SwingWorker 提供的,然后您的 GUI 将变得更具响应性。

有关这方面的详细信息,请查看本教程:Concurrency in Swing

如果尽管有这个建议,您仍然遇到问题,那么您可能不得不发布一些有问题的代码。如果您可以创建一个可重现该问题的小型可编译和可运行应用程序,最好是SSCCE

¡Que tengas suerte!

【讨论】:

  • +1、了解EDT和单线程规则是学习Swing最重要的概念之一。教程链接对此始终很重要。
  • 我最终在 actionPerformed 方法中使用了 invokeLater(new Runnable { etc..。不过,我将仔细研究 EDT,以便更好地了解正在发生的事情.
  • 在阅读了有关 EDT 和 SwingWorker 的更多内容之后,您似乎是对的,而且 SwingWorker 确实是处理任何可能需要时间才能完成的后台任务的方法。 GUI 现在保持应有的响应能力。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多