如何推送所选选项卡更新(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()
,但是在检查了提供的示例后,我不明白如何实现这一点。非常感谢您的帮助!