简体   繁体   中英

How can I push a selected tab update (java swing)?

I'm trying to update the tab being displayed, however it seems to wait until the end of the method and then update. Is there a way to make the tab being displayed update immediately?

Here is an example of the code where I'm having this issue:

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();
        }
    });
}

The reason for this is that the method is being executed in the Event Dispatch thread, and any repaint operations will also occur in this thread . One "solution" is to update the tab index and then schedule the remaining work to be invoked later on the EDT; this should cause the tab state to be updated immediately; eg

public void actionPerformed(ActionEvent evt) {
  tab.setSelectedIndex(1);

  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      // Do remaining work.
    }
  });
}

EDIT

Per your comment below an example of how to invoke a SwingWorker in order to call your runProgram method would look something like this:

// 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()

However, I sense a bigger problem here: The fact that you are seeing a significant delay in updating the tab makes me think you are performing long running calculations on the EDT. If this is the case you should consider performing this work on a background thread. Take a look at the SwingWorker class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM