Java JTabbedPane立即切换选项卡

Java JTabbedPane立即切换选项卡,java,swing,jtabbedpane,Java,Swing,Jtabbedpane,我有一个简单的JTabbedPane组件,有两个选项卡。在其中一个选项卡上触发按钮事件时,我希望立即将当前视图设置为另一个选项卡。我可以使用相关按钮的actionPerformed方法中的setSelectedIndex(int)成功地切换当前选项卡,但按钮事件的剩余功能有时需要一段时间才能完成 似乎setSelectedIndex(int)更改不会立即发生,只有在按钮单击/按下触发的actionPerformed方法主体完成时才会发生 我希望在单击/按下按钮时切换选项卡的原因是,用户可以在另一

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

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

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

所以现在发生的是,我点击按钮,它在那个选项卡上冻结,直到按钮功能完全完成,然后它切换。所以“…请稍候”的信息实际上从未被看到过

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


-Rob

在我看来,线程问题似乎比什么都重要,这将冻结GUI,使其在完成之前完全没有响应,从而延迟选项卡式窗格交换。如果您在action-performed方法中运行任何长时间运行的进程,请改为在后台线程(如SwingWorker提供的线程)中运行这些进程,这样您的GUI将变得更具响应性

有关详细信息,请查看本教程:

如果尽管有这个建议,您仍然有问题,那么您可能不得不发布一些有问题的代码。如果你能创建一个小的、可编译的、可运行的应用程序来重现这个问题,最好的方法就是创建一个


“我的天哪

你可能想做的实际上是不同的事情:如果你仔细想想,如果你看看复杂的应用程序(比如IDE),你会发现它们通常不会介意在应用程序的每个选项卡/子选项卡/子屏幕/任何地方嵌入“请等待”消息。他们所做的是放置一个可以从应用程序的任何部分看到的进度条,并从用户所在的应用程序的任何“部分”更新进度条。与某些浏览器总是在同一位置显示加载的每个页面的百分比的方式不同。在我看来,这是一个更好的设计。一个进度条会很好,但我有点赶时间,我肯定没有时间来实现跟踪剩余时间的功能。我理解你的意思,但是,当你简单地把消息放在应用程序的某个通用区域时,我可能会考虑它。+ 1,理解EDT和单线程规则是学习摆动的最重要的概念之一。教程链接对这一点总是很重要的。我最终使用invokeLater(新的Runnable)使它工作起来{etc..在actionPerformed方法中。不过,我会更仔细地看看EDT,以便更好地了解正在发生的事情。在阅读了更多关于EDT和SwingWorker的内容后,似乎您是对的,SwingWorker确实是完成任何可能需要时间的后台任务的方法。GUI现在仍然作为响应尽管应该如此,谢谢。