如何推送所选选项卡更新(java swing)?
我试图更新正在显示的选项卡,但是它似乎要等到方法结束后再更新。有没有办法使显示的选项卡立即更新 下面是我遇到此问题的代码示例:如何推送所选选项卡更新(java swing)?,java,swing,tabs,updatepanel,Java,Swing,Tabs,Updatepanel,我试图更新正在显示的选项卡,但是它似乎要等到方法结束后再更新。有没有办法使显示的选项卡立即更新 下面是我遇到此问题的代码示例: private static void someButtonMethod() { Button = new JButton("My Button"); Button(new ActionListener() { public void actionPerformed(ActionEvent e) {
private static void someButtonMethod()
{
Button = new JButton("My Button");
Button(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
tabs.setSelectedIndex(1);
// Do some other things (In my case run a program that takes several seconds to run).
runProgram();
}
});
}
原因是该方法正在事件分派线程中执行,任何重绘操作也将在此线程中发生。一个“解决方案”是更新选项卡索引,然后安排剩余的工作稍后在EDT上调用;这将导致选项卡状态立即更新;e、 g
public void actionPerformed(ActionEvent evt) {
tab.setSelectedIndex(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Do remaining work.
}
});
}
编辑
根据下面的注释,如何调用SwingWorker
以调用runProgram方法的示例如下所示:
// Typed using Void because runProgram() has no return value.
new SwingWorker<Void, Void>() {
protectedVoid doInBackground() {
runProgram();
return null; // runProgram() doesn't return anything so return null.
}
protected void done() {
// Called on the EDT when the background computation has completed.
// Could insert code to update UI here.
}
}.execute()
//使用Void键入,因为runProgram()没有返回值。
新SwingWorker(){
protectedVoid doInBackground(){
运行程序();
return null;//runProgram()不返回任何内容,因此返回null。
}
受保护的void done(){
//后台计算完成后在EDT上调用。
//可以在此处插入代码以更新UI。
}
}.execute()
然而,我在这里感觉到了一个更大的问题:您在更新选项卡时看到了显著的延迟,这一事实使我认为您正在EDT上执行长时间运行的计算。如果是这样的话,你应该考虑在后台线程上执行这项工作。查看该类。原因是该方法正在事件分派线程中执行,任何重绘操作也将在该线程中发生。一个“解决方案”是更新选项卡索引,然后安排剩余的工作稍后在EDT上调用;这将导致选项卡状态立即更新;e、 g
public void actionPerformed(ActionEvent evt) {
tab.setSelectedIndex(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Do remaining work.
}
});
}
编辑
根据下面的注释,如何调用SwingWorker
以调用runProgram方法的示例如下所示:
// Typed using Void because runProgram() has no return value.
new SwingWorker<Void, Void>() {
protectedVoid doInBackground() {
runProgram();
return null; // runProgram() doesn't return anything so return null.
}
protected void done() {
// Called on the EDT when the background computation has completed.
// Could insert code to update UI here.
}
}.execute()
//使用Void键入,因为runProgram()没有返回值。
新SwingWorker(){
protectedVoid doInBackground(){
运行程序();
return null;//runProgram()不返回任何内容,因此返回null。
}
受保护的void done(){
//后台计算完成后在EDT上调用。
//可以在此处插入代码以更新UI。
}
}.execute()
然而,我在这里感觉到了一个更大的问题:您在更新选项卡时看到了显著的延迟,这一事实使我认为您正在EDT上执行长时间运行的计算。如果是这样的话,你应该考虑在后台线程上执行这项工作。看看这个类。给我们看一些代码,看看“方法的结尾”是什么意思!我添加了我的示例。您运行的程序完成后是否选择了选项卡?我不确定您的确切意思,但我会尝试使用tab.invalidate()Does tabs.setSelectedIndex(1);不立即执行?给我们看一些代码,看看“方法的结束”是什么意思!我添加了我的示例。您运行的程序完成后是否选择了选项卡?我不确定您的确切意思,但我会尝试使用tab.invalidate()Does tabs.setSelectedIndex(1);不能马上表演吗?谢谢你的帮助。我一直在看你提供的课程,但是我很难理解如何在我的课程中使用它。你能给我一些建议吗?你到底有什么困难?您指的是SwingWorker类还是上面的代码段?SwingWorker类。基本上,我想在后台线程中运行方法
runProgram()
,但是在检查了提供的示例后,我不明白如何实现这一点。非常感谢您的帮助!谢谢你的帮助。我一直在看你提供的课程,但是我很难理解如何在我的课程中使用它。你能给我一些建议吗?你到底有什么困难?您指的是SwingWorker类还是上面的代码段?SwingWorker类。基本上,我想在后台线程中运行方法runProgram()
,但是在检查了提供的示例后,我不明白如何实现这一点。非常感谢您的帮助!