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);
}
}
doInBackground 메서드의 진행률 표시 줄을 방해해서는 안됩니다. 이 방법은 EDT가 아닌 백그라운드에서 실행되므로 스윙 구성 요소를 수정하거나 액세스해서는 안됩니다. 그것들을 생성자 나'SwingWorker' 인스턴스를 생성 한 곳으로 옮기십시오. – Robin
@Robin 제 코드를 수정했습니다. 그러나 메소드가 완료되기 전에 진행 대화 상자가 닫힙니다. 메서드 호출이 끝날 때까지 기다렸다가 자동으로 닫을 수 있습니다. – Amarnath
답변을 추가했습니다. 조금 오래 덧글에 – Robin