2010-01-16 4 views
1

일련의 .jpg를 보여주는 애니메이터를 수행하고 있습니다. 애니메이터는 텍스트를 표시하는 데 사용하는 다른 JLabel을 업데이트하면서 실행중인 스레드입니다. 그러나 ImageIcon을 다시 칠하지는 않을 것입니다. 스레드 클래스는 txAnimate입니다. 뭐가 문제 야?JLabel이 다시 칠하지 않음

public class main extends JFrame implements ActionListener, ItemListener, ChangeListener { 

    public main() { 
     try { 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setTitle("FYP Video Platform"); 
      setResizable(true); 
      setVisible(true); 

      BoxLayout guiLayout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS); 
      getContentPane().setLayout(guiLayout); 

      displayPanel_lbl_Tx = new JPanel(); 
      displayPanel_lbl_Rx = new JPanel(); 
      displayPanel = new JPanel(); 
      buttonPanel_Tx = new JPanel(); 
      buttonPanel_Rx = new JPanel(); 
      selectPanel = new JPanel(); 
      prefixPanel = new JPanel(); 
      statusPanel = new JPanel(); 

      adddisplayPanel(); 
      addselectPanel(); 
      addprefixPanel(); 
      addstatusPanel(); 

      displayPanel.setAlignmentX(CENTER_ALIGNMENT); 
      selectPanel.setAlignmentX(CENTER_ALIGNMENT); 
      prefixPanel.setAlignmentX(CENTER_ALIGNMENT); 
      statusPanel.setAlignmentX(CENTER_ALIGNMENT); 
      this.add(displayPanel); 
      this.add(selectPanel); 
      this.add(prefixPanel); 
      this.add(statusPanel); 
      pack(); 

     } catch (Exception e) { 
      System.out.println("Exception: " + e.toString()); 
     } 
    } 

    public void addNotify() { 
     //init 
     super.addNotify(); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == btnStart_Tx) { 
      if (animator == null) { 
       lblDisplay_Tx.setVisible(true); 
       animator = new Thread(new txAnimate()); 
       pauseAnimator = false; 
       animator.start(); 
      } else if (btnStart_Tx.getText().equals("Start")) { 
       pauseAnimator = false; 
       animator.start(); 
      } 

      if (btnStart_Tx.getText().equals("Resume")) { 
       pauseAnimator = false; 
       try { 
        synchronized (this) { 
         notify(); 
        } 
       } catch (Exception p) { 
        System.out.println(p); 
       } 
      } 

      btnStart_Tx.setEnabled(false); 
      btnStop_Tx.setEnabled(true); 
      btnPause_Tx.setEnabled(true); 
      btnFile.setEnabled(false); 
      lblDisplay_Tx.setVisible(true); 
     } 
    } 

    private class txAnimate implements Runnable { 

     public void run() { 
      do { 
       try { 
        lblDisplay_Tx.setVisible(true); 
        for (int i = 1; i <= (matlab.getNumFrame() - 1); i++) { 
         if (animator == null) { 
          //break the loop, when stop is pressed 
          break; 
         } 

         if ((new File(matlab.getprefix_Tx() + i + ".jpg")).exists() == false) { 
          lblStatus_Tx.setText("Buffering..."); 
          Thread.sleep(1000); 
         } 

         ImageIcon images = new ImageIcon(matlab.getprefix_Rx() + i + ".jpg"); 
         lblDisplay_Tx.setIcon(images); 
         lblDisplay_Tx.paintAll(lblDisplay_Tx.getGraphics()); 
         Thread.sleep(matlab.getFramerate()); 
         lblStatus_Tx.setText("Frame " + i + "/" + (matlab.getNumFrame() - 1)); 

         synchronized (this) { 
          while (pauseAnimator) { 
           wait(); 
          } 
         } 
        } 
        if (loop_Tx == false) { 
         btnStart_Tx.setText("Start"); 
         btnStart_Tx.setEnabled(true); 
         btnStop_Tx.setEnabled(false); 
         btnPause_Tx.setEnabled(false); 
         btnFile.setEnabled(true); 
         lblDisplay_Tx.setVisible(false); 
         animator = null; 
        } 

       } catch (InterruptedException e) { 
        System.out.println(e); 
       } 
       repaint(); 
      } while (loop_Tx); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       new main(); 
      } 
     }); 
    } 
} 
+0

이것은 완전한 코드가 아닙니다. 전체 파일을 게시하십시오. 그리고 코드 버튼 ('101')을 사용하십시오 : 주먹 텍스트를 붙인 다음 모두 선택하고 코드 버튼을 누르십시오. –

답변

관련 문제