2017-08-30 136 views
0

我試過下面的代碼。 Functionality-Java swing Loader圖像顯示不正確?

  1. 點擊按鈕
  2. 它將調用,這將需要一些時間來處理的方法。
  3. 需要顯示加載程序的圖像,以便用戶可以看到處理正在進行。

下面我試過,但如果方法調用之前loaderLabel1.setVisible(true);亙古不顯示圖像,如果我們評論loaderLabel1.setVisible(false);話,就說明加載圖像法結束後。

actionPerformed方法不應用標籤的可見性,除非它完成?如果是,那麼這個問題是否有其他選擇?

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class TestLoader extends JPanel{ 


    static ImageIcon loading1 = new ImageIcon("D:\\WORKSPACE\\STUDY\\images\\ajax-loader.gif"); 



    static JLabel loaderLabel1 = new JLabel(loading1, JLabel.CENTER); 


    public TestLoader(){ 
     super(new GridLayout(0, 1));   
     System.out.println("---------TEST ------"); 

     JPanel submitPanel = new JPanel(); 
     submitPanel.add(clearMessageButton); 
     this.add(submitPanel); 

     JPanel LOADER_PANEL = new JPanel(); 
     loaderLabel1.setVisible(false); 
     LOADER_PANEL.add(loaderLabel1); 
     this.add(LOADER_PANEL); 
    } 


    JButton clearMessageButton = new JButton(new AbstractAction("Test Result") { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 

      loaderLabel1.setVisible(true); 

      TestMethod(); 

      loaderLabel1.setVisible(false); 

     }}); 

    public void TestMethod(){ 
     System.out.println(" =========START TestMethod ========="); 
     try { 
      Thread.currentThread().sleep(10000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(" =========complete TestMethod ========="); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(final String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestLoader pf = new TestLoader(); 
       pf.display(); 
      } 
     }); 


    } 

    private void display() { 
     JFrame frame = new JFrame("TEST LOADER"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(this); 
     frame.pack(); 
     frame.setResizable(true); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

線程問題:請勿對事件派發線程執行處理。 'setVisible(true)'調用在事件隊列中放置一個事件,並在'actionPerformed()'方法返回後執行...... –

+0

@UsagiMiyamoto:謝謝你提供的信息。使用SwingWorker終於解決了我的問題。 –

回答

1

有一個類SwingWorker允許您在不同的線程中執行任務;這裏是你的代碼如何被更改爲使用SwingWorker類的例子:這確實在其他線程的工作,做

JButton clearMessageButton = new JButton(new AbstractAction("Test Result") { 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     SwingWorker worker = new SwingWorker() { 

      @Override 
      protected Object doInBackground() throws Exception { 
       loaderLabel1.setVisible(true); 
       TestMethod(); 
       return true; 
      } 

      public void TestMethod() { 
       System.out.println(" =========START TestMethod ========="); 
       try { 
        Thread.currentThread().sleep(10000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println(" =========complete TestMethod ========="); 
      } 

      protected void done() { 
       loaderLabel1.setVisible(false); 
      }; 
     }; 
     worker.execute(); 
    } 
}); 

注意方法doInBackground()()是doInBackground()之後調用完成。

+0

這解決了我的問題。感謝您的幫助 。 –