0

我正在使用 Netbeans IDE 使用 Java Swing 构建一个小型测试工具。

我正在尝试更新一个标签,该标签在某种程度上没有得到“重新粉刷”/“刷新”。我查看了一些关于 SO 的类似问题,但无法解决我的问题。

private void excelFileChooserActionPerformed(java.awt.event.ActionEvent evt)
{
    if(!JFileChooser.CANCEL_SELECTION.equals(evt.getActionCommand()))
    {
        String selectedFile = excelFileChooser.getSelectedFile().getAbsolutePath();
        loaderLabel.setText("Please Wait..");
        try {
            //This is sort of a blocking call, i.e. DB calls will be made (in the same thread. It takes about 2-3 seconds)
            processFile(selectedFile);
            loaderLabel.setText("Done..");
            missingTransactionsPanel.setVisible(true);
        }
        catch(Exception e) {
            System.out.println(e.getMessage());
            loaderLabel.setText("Failed..");
        }
    }
}

loaderLabel是 aJLabel并且使用的布局是AbsoluteLayout.

所以,我的问题是“请稍候......”从未显示。尽管调用该方法processFile大约需要 2-3 秒,但从未显示“请稍候...” 。但是,会显示“完成...”/“失败...”

如果我在调用 之前添加popup( ) ,则会显示“请稍候..”。我无法清楚地理解为什么会这样。JOptionPaneprocessFile

在进行繁重的方法调用之前,我应该遵循“良好做法”吗?我需要调用显式重绘/刷新/重新验证吗?

4

2 回答 2

3

你需要打电话

 processFile(selectedFile);

在另一个线程中(不在 AWT 线程中)。为此,您可以执行以下操作:

Thread t = new Thread(){
   public void run(){
       processFile(selectedFile);
       // now you need to refresh the UI... it must be done in the UI thread
       // to do so use "SwingUtilities.invokeLater"
       SwingUtilities.invokeLater(new Runnable(){
          public void run(){
              loaderLabel.setText("Done..");
              missingTransactionsPanel.setVisible(true);
          }
          }
       )
   }
};
t.start();

请注意,我很长时间没有使用 swing,所以这段代码可能存在一些语法问题。

于 2012-12-20T12:15:46.983 回答
2

您是否尝试过使用 SwingUtilities.invokeLater() 向 EDT 发送呼叫?

http://www.javamex.com/tutorials/threads/invokelater.shtml

于 2012-12-20T12:04:45.370 回答