2013-08-06 2 views
0

JNI 기능을 완료하는 데 시간이 오래 걸릴 수 있으며 기능을 완료하는 동안 불확실 모드에서 JProgress 표시 줄을 실행하고 싶습니다. Oracle에서 제공하는 자습서를 읽었지 만 자습서의 성격 상 이해할 수 없습니다. 백그라운드 스레드에서이 함수를 실행해야한다는 것을 알았지 만 어떻게해야하는지 잘 모르겠습니다.JProgress Bar 불확정 모드가 업데이트되지 않습니다.

다음은 관련 코드입니다. 내가 누르면 함수 (mainCpp())를 호출 할 버튼 (runButton)이 있습니다.

public class Foo extends javax.swing.JFrame 
         implements ActionListener, 
            PropertyChangeListener{ 

    @Override 
    public void actionPerformed(ActionEvent ae){ 
     //Don't know what goes here, I don't think it is necessary though because I do not intend to use a determinate progress bar 
    } 

    @Override 
    public void propertyChange(PropertyChangeEvent pce){ 
     //I don't intend on using an determinate progress bar, so I also do not think this is necassary 
    } 

class Task extends SwingWorker<Void, Void>{ 

    @Override 
    public Void doInBackground{ 
     Foo t = new Foo(); 
     t.mainCpp(); 

     System.out.println("Done..."); 
    } 
    return null; 
} 

/*JNI Function Declaration*/ 
public native int mainCpp(); //The original function takes arguments, but I have ommitted them for simplicity. If they are part of the problem, I can put them back in. 

...//some codes about GUI 

private void runButtonActionPerformed(java.awt.event.ActionEvent evt) { 

    ProgressBar.setIndeterminate(true); 
    Task task = new Task(); 
    task.execute();  
    ProgressBar.setIndeterminate(false); 

} 


/*Declarations*/ 
private javax.swing.JButton runButton; 
} 

도움이 되길 바랍니다.

EDIT : 키 헤루가 제안한 것을 수행하려고 시도했지만 여전히 작동하지 않습니다. 당신은 다음을 사용하여 포함 된 개체의 필드에 인스턴스를 유지할 수 있습니다

class Task extends SwingWorker<Void, Void>{ 
    @Override 
    public Void doInBackground() { 
     // I'm not sure of the code snippets if you are already in a 
     // Foo instance; if this is internal to Foo then you obviously do 
     // not need to create another instance, but just call mainCpp(). 
     Foo t = new Foo(); 
     t.mainCpp(); 
     return null; 
    } 

    @Override 
    public void done() 
     // Stop progress bar, etc 
     ... 
    } 
} 

다음과 같이 작동합니다 : 당신을 가정

+0

doInBackround()에서 실행하는 것에 대한 가정은 정확합니다. SwindWorkers는 실행을 시작하기 위해'execute()'호출 만 있으면되므로 미리 작업자를 준비하면 버튼 작업에서 호출 할 수 있습니다. 또는 SwingWorker를 제자리에 만들고 실행할 수 있습니다. – kiheru

+0

"사전에 노동자를 준비"하는 것이 무엇을 의미하는지 자세히 설명해 주시겠습니까? –

답변

0

이 같은 SwingWorker를 가지고

private void runButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    // Start progress bar, disable the button, etc. 
    ... 
    // Task task has been created earlier, maybe in the constructor 
    task.execute(); 
} 

, 또는 작업자를 제자리에 만들 수 있습니다.

private void runButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    // Start progress bar, disable the button, etc. 
    ... 
    new Task().execute(); 
} 
+0

이것이 내가 시도한 것 (내 편집 확인)이지만 진행률 표시 줄은 움직이지 않는다고 생각합니다. –

+0

@SeanSenWang runButtonActionPerformed()에서 진행률 막대를 중지하지 마십시오. 즉시 완료됩니다. 대신 SwingWorker의'done()'에서 수행하십시오. 'new Foo()'에 대한 주석도 참고하십시오 (아무 것도 부수 지 말고 불필요 할 수도 있습니다). – kiheru

+0

아, 액션 이벤트 밖에서'indeterminate (false) '를 설정해야합니다. 고맙습니다. –