2012-11-19 6 views
1

t.isStopped()에 대한 액세스를 run() 오버라이드하지만 다음과 같은 오류가 발생합니다.ActionListener에서 override() 메소드를 호출하십시오.

내가 최종 변수

로컬 변수 t를 t로 설정하면 다른 방법

정의 내부 클래스 내에 비 최종 변수 t를 참조 할 수 없습니다 금지 된

<!-- language: java --> 

jHibernateCheckBox = new JCheckBox("Sleep/Hibernate after "); 
jHibernateTextField = new JTextField("240"); 

jHibernateCheckBox.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 


    StoppableThread t = new StoppableThread() { 

     @Override 
     public void run() { 
      t.setIsRunning(true); 
      long timestamp = new Date().getTime(); 
      int minutes = Integer.parseInt(jHibernateTextField.getText()); 
      long secounds = minutes * 60; 
      long millisecounds = secounds * 1000; 
      long elapsedTime = new Date().getTime(); 

      do { 
       try { 
       Thread.sleep(1000); 
       millisecounds -= new Date().getTime() - elapsedTime; 
       secounds = millisecounds/1000; 
       if(secounds < 60) { 
        jHibernateTextField.setText("" + secounds); 
        jRemainingLabel.setText(" secounds remaining"); 
       } 
       else { 
        jHibernateTextField.setText("" + secounds/60); 
        jRemainingLabel.setText(" minutes remaining"); 
       } 
       } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
       elapsedTime = new Date().getTime(); 
      }while(!t.isStopped() && timestamp + minutes * 60 * 1000 > new Date().getTime()); 

      jHibernateTextField.setText("" + minutes); 

      if(t.isStopped()) return; 
      else { 
       console.out("Computer wird schlafen gelegt =)"); 
       //Hibernate (siehe LAPTOP) 
      } 

     } 
    }; 

    Thread thread = new Thread(t); 


    if(jHibernateCheckBox.isSelected()) { 
     jHibernateTextField.setEnabled(false); 
     thread.start(); 
    } 
    else { 
     jHibernateTextField.setEnabled(true); 
     t.setIsStopped(true); 
    } 
    } 
을 초기화 된

});

내부 클래스 에서 변수 t에 액세스 할 수 있습니까? 아니면 확인란을 다시 클릭하면 스레드를 중지하는 방법을 아는 사람이 있습니까?

jHibernateCheckBox를 다시 클릭 할 때 타이머가 작동하지 않게하려면 ... 다른 방법이 있습니까?

+1

응답 라인 또는 오류를 표시 줄의 코드는 무엇입니까? –

+0

이 오류가 발생한 줄은 무엇입니까? t.setIsRunning (true) 인 경우 t를 this로 바꾸어보십시오. –

+0

은 t가있는 run 메소드의 모든 행에서 ... t를이 코드로 대체하면 코드에 아무런 영향을주지 않습니다. –

답변

1

구현 내에서 'this'키워드를 사용해 볼 수 있습니까?

+0

당신은 저를 때리려고합니다. XD –

+0

jHibernateCheckBox를 누르고 스레드가 활성 인 경우 t.setIsSpped (true)가 true로 설정되었지만 실행 메소드에서 t를 설정하면이 질문을하기 전에 시도한 바 있습니다. =) –

1
    StoppableThread t = new StoppableThread() { 

        @Override 
        public void run() { 
         t.setIsRunning(true); 
         long timestamp = new Date().getTime(); 
         int minutes = Integer.parseInt(jHibernateTextField.getText()); 
         long secounds = minutes * 60; 
         long millisecounds = secounds * 1000; 
         long elapsedTime = new Date().getTime(); 

         do { 
          try { 
           Thread.sleep(1000); 
           millisecounds -= new Date().getTime() - elapsedTime; 
           secounds = millisecounds/1000; 
           if(secounds < 60) { 
            jHibernateTextField.setText("" + secounds); 
            jRemainingLabel.setText(" secounds remaining"); 
           } 
           else { 
            jHibernateTextField.setText("" + secounds/60); 
            jRemainingLabel.setText(" minutes remaining"); 
           } 
          } catch (InterruptedException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
          elapsedTime = new Date().getTime(); 
         }while(!t.isStopped() && timestamp + minutes * 60 * 1000 > new Date().getTime()); 

         jHibernateTextField.setText("" + minutes); 

         if(t.isStopped()) return; 
         else { 
          console.out("Computer wird schlafen gelegt =)"); 
          //Hibernate (siehe LAPTOP) 
         } 

        } 
       }; 

실행 방법 내에서 t를 this으로 바꿉니다.

+0

.isStopped() 또는 this.isStopped() 출력이 이미 false ... –

+0

-1 스윙의 EDT 규칙 – kleopatra

2

질문과 관련이 없지만 게시 한 스 니펫에 스윙 스레딩 규칙을 위반했습니다. 모든 Swing 구성 요소는 Event Dispatch Thread에서만 액세스하거나 수정해야합니다. StoppableThread에서 Swing 구성 요소를 수정하면 런타임에 이상한 동작이 발생할 수 있습니다.

코드를 간략하게 살펴본 후 SwingWorker을 사용하고 진행 상황 이벤트를 실행할 수 있습니다. JProgressBar tutorial (SwingWorker을 사용하는 부분)에 표시된 것과 거의 같은 메커니즘.

자세한 내용은 Swing concurreny tutorial을 참조하십시오.

-1

새로운 것을 시도해 보았습니다. 이제는 작동합니다. 나는 이것이 우울한 지 모르지만,
을 한번보세요. 모든

private StoppableThread t; 

public void initComponents() { 
... 
... 
t = new StoppableThread() { 
     @Override 
     public void run() { 
      setIsRunning(true); 
      long timestamp = new Date().getTime(); 
      int minutes = Integer.parseInt(jHibernateTextField.getText()); 
      long secounds = minutes * 60; 
      long millisecounds = secounds * 1000; 
      long elapsedTime = new Date().getTime(); 

      do { 
       try { 
        Thread.sleep(1000); 
        millisecounds -= new Date().getTime() - elapsedTime; 
        secounds = millisecounds/1000; 
        if(secounds < 60) { 
         jHibernateTextField.setText("" + secounds); 
         jRemainingLabel.setText(" secounds remaining"); 
        } 
        else { 
         jHibernateTextField.setText("" + secounds/60); 
         jRemainingLabel.setText(" minutes remaining"); 
        } 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       elapsedTime = new Date().getTime(); 
      }while(!isStopped() && timestamp + minutes * 60 * 1000 > new Date().getTime()); 

      jHibernateTextField.setText("" + minutes); 

      if(isStopped()) return; 
      else { 
       console.out("Computer wird schlafen gelegt =)"); 
       //Hibernate (siehe LAPTOP) 
      } 

     } 
    }; 

    jHibernateCheckBox.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 


      Thread thread = new Thread(AutoBarbarPanel.this.t); 


      if(jHibernateCheckBox.isSelected()) { 
       jHibernateTextField.setEnabled(false); 
       thread.start(); 
      } 
      else { 
       jHibernateTextField.setEnabled(true); 
       t.setIsStopped(true); 
      } 
     } 

    }); 
} 

덕분에

+1

이 (가) EDT 규칙을 위반하는 경우 ... – kleopatra

+0

EDT 규칙을 위반하지 않고 해결책을 알려주십시오.) –

+0

튜토리얼 읽기 @Robin에서 참조하고 코드에 적용하십시오 ;-) – kleopatra

관련 문제