2012-11-13 2 views
3

UI에서 서버 호출이 있습니다. 응답 시간은 거의 없습니다. 그래서 서버에서 데이터를로드하는 동안 진행률 막대를 표시하려고합니다. 진행률 표시 줄을 표시하려면이 approach을 사용하여 다음 코드를 시도했습니다. 내가 잘못하고있는 곳 중 일부는 버튼 클릭시 calculateResult() 메서드를 호출 할 때 진행률 막대가 표시되지 않습니다. 진행률 표시 줄에 백분율을 표시 할 필요가 없습니다. 데이터가로드되고 있음을 보여줄 필요가 있습니다.스윙에서 데이터로드 중 JProgressBar

// 다음 코드를 시도했습니다.

panel.add(PROGRESS_BAR); 
panel.add(button); 

이 트릭을 할 것입니다 : 당신이 당신의 패널 간단한

에 추가되지 않기 때문에

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.lang.reflect.InvocationTargetException; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingUtilities; 
import javax.swing.SwingWorker; 

public class MyProgressBarTest extends JFrame { 
private static final long serialVersionUID = 1L; 

private static JProgressBar progressBar; 

public static void main(String[] args) { 
    MyProgressBarTest obj = new MyProgressBarTest(); 
    obj.createGUI(); 
} 

public void createGUI() { 
    JPanel panel = new JPanel(); 
    JButton button = new JButton("Progress"); 

    progressBar = new JProgressBar(); 

    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 

      MyCustomProgressBarDialog progressBarObj = new MyCustomProgressBarDialog(progressBar); 
      progressBarObj.createProgressUI(); 

      MyActionPerformer actionObj = new MyActionPerformer(progressBar); 
      actionObj.execute(); 

      progressBarObj.setVisible(false); 
     } 
    }); 

//  panel.add(progressBar); 
    panel.add(button); 
    add(panel); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 
//  pack(); 
    setSize(200, 300); 
    setVisible(true); 
} 
} 

class MyActionPerformer extends SwingWorker<String, Object> { 

JProgressBar fProgressBar; 

public MyActionPerformer(JProgressBar progressBar) { 
    this.fProgressBar = progressBar; 
    this.fProgressBar.setVisible(true); 
    this.fProgressBar.setIndeterminate(true); 
} 

protected String doInBackground() throws Exception { 

    calculateResult(); 
    return "Finished"; 
} 

protected void done() { 
    fProgressBar.setVisible(false); 
} 

public void calculateResult() { 
    for (int i = 0; i < 500000; i++) { 
     System.out.println("Progress Bar: " + i); 
    } 
} 
} 

class MyCustomProgressBarDialog extends JDialog { 
private static JProgressBar progressBar; 

public MyCustomProgressBarDialog(JProgressBar progressBar) { 
    this.progressBar = progressBar; 
} 

public void createProgressUI() { 
    add(progressBar); 
    setLocationRelativeTo(null); 
    setSize(50, 20); 
    setVisible(true); 
} 
} 
+0

doInBackground 메서드의 진행률 표시 줄을 방해해서는 안됩니다. 이 방법은 EDT가 아닌 백그라운드에서 실행되므로 스윙 구성 요소를 수정하거나 액세스해서는 안됩니다. 그것들을 생성자 나'SwingWorker' 인스턴스를 생성 한 곳으로 옮기십시오. – Robin

+0

@Robin 제 코드를 수정했습니다. 그러나 메소드가 완료되기 전에 진행 대화 상자가 닫힙니다. 메서드 호출이 끝날 때까지 기다렸다가 자동으로 닫을 수 있습니다. – Amarnath

+0

답변을 추가했습니다. 조금 오래 덧글에 – Robin

답변

5

가 진행 막대가 즉시 사라 이유는 ActionListener

button.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
    MyCustomProgressBarDialog progressBarObj = new MyCustomProgressBarDialog(progressBar); 
    progressBarObj.createProgressUI(); 

    MyActionPerformer actionObj = new MyActionPerformer(progressBar); 
    actionObj.execute(); 

    progressBarObj.setVisible(false); 
    } 
}); 

actionObj.execute(); 방법은 차단하지 (좋은 일이 있거나 쓸모가있을 것이다) 당신이 시작 직후 그와 SwingWorker 당신이 실행됩니다 호출을 의미 progressBarObj.setVisible(false); 성명

이렇게하면 진행률 표시 줄 대화 상자가 사라집니다.

나는뿐만 아니라 SwingWorker에 대화 전달이

  • 에 대한 2 개 솔루션의 생각과 SwingWorker 화재를 허용 PropertyChangeEvent s를 SwingWorker
  • done 방법 대화 상자에 setVisible(false)를 호출 할 수 있습니다 얼마나 멀리 진행했는지를 결정합니다. 그러한 리스너를 사용하여 계산이 완료되면 대화 상자를 숨길 수 있습니다.
+0

고마워. :) 나는 첫 번째 해결책을 사용하여 그것을 해냈다. 하지만 실제로 배울 것이 좋습니다 .. 첫 번째 또는 두 번째 PropertyChangeEvent를 사용하여? – Amarnath

+1

@Che 나는 미각의 문제라고 말하고 싶습니다.나는 처음으로 개인적으로 선호한다. – Robin

1

당신은 당신의 진행 표시 줄을 볼 수 없습니다.

도움이 되었기를 바랍니다. 건배

1

JProgressBarComponent입니다. 가시화 되려면 Container에 추가해야합니다. 당신은 당신을 어디에도 추가하지 않았습니다.

+0

+1을 포함 할 수 있었다. .. Yaa .. 그것은 효과가 있었지만, 나는 메인 프레임의 상단에 오는 별도의 프레임으로 필요합니다. 어떻게 할 수 있습니까? – Amarnath

+0

별도의 JDialog를 생성하고 진행 막대를 추가하십시오. 나사산 부분을 조심하십시오. –

+0

감사합니다. 당신이 말했듯이 나는 지금 문제가있다. 내 방법이 끝나기 전에 진행 대화 상자가 닫힙니다. 내 코드를 업데이트했습니다 – Amarnath