2017-08-30 6 views
0

私は以下のコードを試しました。ボタン Javaスイングローダーイメージが正しく表示されていませんか?

  • 上 Functionality-

    1. クリックしてそれは処理に時間がかかりますメソッドを呼び出します。
    2. 処理が進行中であることをユーザーが確認できるように、ローダーイメージを表示する必要があります。

    私は以下を試みたが、メソッド呼び出しの前にloaderLabel1.setVisible(true);はショーの画像をdoesnot場合、我々は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があります。 ()doInBackground後に呼び出される終了し、他のスレッドで作業を行い、行わ

    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()():ここにあなたのコードは、SwingWorkerのを使用するように変更することができる方法の例です。

    +0

    これは私の問題を解決しました。お手伝いありがとう 。 –

    関連する問題