2016-06-08 3 views
0

저는 프로그래밍에 익숙하며 이에 대해 약간의 문제가 있습니다.JDialog가 처리하지 않습니다.

문제는 내가이 프레임을 다른 프레임으로 변경하고 돌아갈 때 다른 프레임의 시간에 타이머를 표시하기 위해 JDialog를 사용하여 할당을 만드는 데 스윙 팔레트를 사용하고 있습니다. 이전 JDialog의 타이머가 실행중인 첫 번째 타이머와 겹치기 때문에 문제를 해결할 수 없었습니다.

다음은 코드입니다. 나는 그게 문제라고 생각하지 않기 때문에

주요

public static void main(String[] args) { 
    Panel0 screen=new Panel0(); 
    screen.setTitle(""); 
    screen.setLocationRelativeTo(screen); 
    screen.setVisible(true); 

} 

1 FRAME

public class Panel0 extends javax.swing.JFrame { 
Panel s=new Panel(); 

private void fisica1ActionPerformed(java.awt.event.ActionEvent evt) {           
    s.time(); 
    s.setTitle("FISIC I"); 
    s.setLocationRelativeTo(s); 
    s.setVisible(rootPaneCheckingEnabled); 
    s.dialog.setVisible(rootPaneCheckingEnabled); 
    dispose(); 
}   

2 FRAME

public class Panel extends javax.swing.JFrame {  

private void EndActionPerformed(java.awt.event.ActionEvent evt) {          
    dialog.dispose(); 
    dialog.setDefaultCloseOperation(0); 

    Panel0 pan=new Panel0(); 
    pan.setLocationRelativeTo(p1); 
    pan.setVisible(rootPaneCheckingEnabled); 
    dispose(); 

} 

void time(){   

    t=new Timer(1,new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (startTime<0) { 
       startTime=System.currentTimeMillis();      
      }     
       long now = System.currentTimeMillis(); 
       long clockTime = now - startTime;     
      if (clockTime >= duration) { 
        clockTime = duration; 
        t.stop(); 
      }     
      SimpleDateFormat sdf=new SimpleDateFormat("mm:ss:SS"); 
           clock.setText(sdf.format(duration-clockTime));         


     } 
    });   
    t.setInitialDelay(0);    
       if (!t.isRunning()) { 
        startTime = -1; 
        t.start(); 
       } 
} 

나는, 타이머 등의 inizialization을 생략.

명확한 설명 : 일단 두 번째 프레임을 닫으면 1 단계가 열리고이 프로세스를 반복해서 반복 할 수있는 옵션이 제공되며 "대화 상자"라는 JDialog가 데이터와 겹칠 때마다 (시계 번호 겹침).

+5

* 코드는 ** 빠졌습니다 ** 더 나은 도움을 받으려면 [MCVE] 또는 [짧은, 자체 포함, 올바른 예] (http://www.sscce.org/)를 게시하십시오.). –

답변

0

dispose()은 개체를 "파괴하거나"상태를 지우는 것이 아닙니다. 즉, 해당 프레임에 연결된 그래픽 리소스 (낮은 수준의 창 핸들 및 물건)를 릴리스한다는 의미입니다. 그것은 여전히 ​​재사용 할 수 있습니다 setVisible(true)

나는 우리가 팝업을 재사용하고 싶어한다고 가정합니다. - 이것은 훌륭합니다.하지만 당신이 "폐기 된"타이머를 잊어 버리는 것을 잊었으므로, 당신이 만든 새로운 타이머가 모두있을 것입니다. 소위 "경주 조건"에 노출된다.

타이머는 간단한 백그라운드 작업이며 명시 적으로 중지해야합니다. 타이머 자체는 수행되지 않습니다.

s.time();에 대한 모든 호출은 이전 타이머를 중지하지 않고 새 타이머를 시작합니다.

간단히 말해서 : 동일한 텍스트 필드를 업데이트하는 타이머가 여러 개 있습니다.

해결 방법 : 새 타이머를 실행하기 전에 이전 타이머를 중지하거나 이전 타이머를 다시 시작하십시오.

관련 문제