2012-02-07 2 views
1

Java에서 파일을 읽을 때 진행률 막대를 표시하는 데 문제가 있습니다. 의도 한대로 모두 작동하며 사용자가 파일을 선택하고 프로그램에서 진행률 표시 줄을 표시해야하지만 빈 빈 프레임을로드하고 파일을 처리 한 다음 결과를 다른 창에로드해야합니다.JPanel이 JFrame에서로드되지 않습니다.

진행률 표시 줄 대화 상자의 내용을 표시하는 프로그램을 가져올 수 없습니다.
작은 도움을 주시면 정말 감사하겠습니다.

다음은 관련된 3 가지 코드의 코드입니다. , showProgressBar는()) 바와 closeProgressBar을 (표시하는 데 사용 반대 할 수있다

public void processFile(File arch) { 

    aFile = arch; 

    final SwingWorker searchOnFile = new SwingWorker(){ 

     @Override 
     protected Object doInBackground() throws Exception { 
     try{ 
      BufferedReader data = new BufferedReader(new FileReader(aFile)); 
      String s; 
      while ((s = data.readLine()) != null) {     
       //long task     
      } 
      data.close(); 
     }catch (Exception e){ //Catch exception if any 
      System.err.println("Error: " + e.getMessage()); 
     } 
    interfacesController.closeProgressBar(); 
    interfacesController.loadResults(someStuff); 
    return null; 
    } 
    }; 

    interfacesController.showProgressBar(); 

    searchOnFile.execute(); 

} 

interfacesController가 GUI를 작동하기위한 모든 방법을 포함 SwingWorker를 함께 해결

//this method reads the file 
public void processFile(File arch) {  
    aFile = arch; 
    Thread threadForSearch = new Thread() { 
    @Override 
    public void run() { 
     try{ 
     listaProveedoresTango = controladoraConsultas.traerProveedores(); 
     listaProveedoresAFIP = new LinkedList(); 
    BufferedReader data = new BufferedReader(new FileReader(aFile)); 
    String s; 
     while ((s = data.readLine()) != null) {     
    //long task     
     } 
     data.close(); 
    }catch (Exception e){ 
     System.err.println("Error: " + e.getMessage()); 
    } 
     } 
    }; 

    interfacesController.loadProgressBar(); 

    threadForSearch.start();   

    try { 
     threadForSearch.join(); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(Controladora.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    this.interfacesController.closeProgressBar(); 
    this.interfacesController.loadResults(someStuff);  
} 

//load a progress bar 
public void loadProgressBar(){   
    JProgressBar pb = new JProgressBar(0,100); 
    pb.setPreferredSize(new Dimension(175,20)); 
    pb.setString("Processing Data"); 
    pb.setStringPainted(true); 
    pb.setIndeterminate(true); 
    JLabel infoLabel = new JLabel("Reading File: "); 
    JButton cancelButton = new JButton("Cancel"); 
    cancelButton.addActionListener(new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
     exitSystem(); 
    } 
    }); 
    cancelButton.setVerticalAlignment(SwingConstants.CENTER); 
    JPanel center_panel = new JPanel(); 
    center_panel.add(infoLabel); 
    center_panel.add(pb); 
    center_panel.add(cancelButton); 
    center_panel.setLayout(new BoxLayout(center_panel,BoxLayout.Y_AXIS)); 
    dialog = new JDialog((JFrame)null, "Processing ..."); 
    dialog.getContentPane().add(center_panel, BorderLayout.CENTER); 
    dialog.setSize(100, 100); 
    dialog.setLocationRelativeTo(null); 
    dialog.pack(); 
    dialog.setVisible(true);   
} 

//close the open progress bar 
public void closeProgressBar(){ 
    this.dialog.dispose(); 
} 

, 내가 요약 된 코드를 게시 . 고마워요!

+0

1) 질문이 있으십니까? 2) EDT를 차단하지 말고 ** EDT에서 ** GUI 업데이트 **를 수행하십시오. E.G. SwingWorker 사용 3) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

답변

2

더 유용한 코드가 없으면 SwingWorker을 사용하는 것이 좋습니다.

배경 스레드에서 긴 GUI 상호 작용 작업을 수행하기위한 추상 클래스입니다. 이러한 작업을 수행하기 위해 몇 가지 백그라운드 스레드를 사용할 수 있습니다. ..

작업의 성격을 감안할 때 ProgressMonitorInputStream을 볼 수도 있습니다.

입력 스트림 읽기 진행률을 모니터링하는 진행률 모니터가 생성됩니다. 시간이 오래 걸리면 사용자에게 알리기 위해 ProgressDialog가 나타납니다. 사용자가 [취소] 버튼을 누르면 InterruptedIOException이 다음 읽기에서 throw됩니다. 스트림을 닫으면 모든 올바른 정리가 수행됩니다.

+1

너무 늦었 어. +1 @Federico Matias Rodriguez JProgressBar에 대한 자습서를 읽으십시오. http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html – mKorbel

+0

SwingWorker, 감사합니다. –

+0

반갑습니다. 다행 이군. :) –

관련 문제