2014-09-24 2 views
0

Java GUI에서 진행률 표시 줄에 진행률을 표시하려고하지만 프로세스가 완료 될 때까지 진행률이 표시되지 않습니다. Java에서 진행률 표시 줄을 사용하는 방법?

내 시도입니다 : 내가하고 싶은 것은이 5000 개 기록 전 과정을 보여주기 위해 진행 막대를 사용하려면 다음,하지만 그것이 작동하지 않는 데이터베이스에서 문자열 기록에 중지 단어를 제거입니다

public void selectTweet(){ 
    Connection conn = null; 
    Statement stmt = null; 
    try{ 
     Class.forName("com.mysql.jdbc.Driver"); 
     conn = Drive 

     rManager.getConnection(DB_URL, USER, PASS); 
     stmt = conn.createStatement(); 

     //menghitung jumlah query pada table tweet 
     String sql = "SELECT COUNT(*) FROM tweet"; 
     ResultSet rs=stmt.executeQuery(sql); 
     int row = 0; 
     while(rs.next()){ 
      row = rs.getInt("COUNT(*)"); 
     } 

     int initial_number = Integer.parseInt(jTextField4.getText()); 

     for(int i=initial_number;i<row;i++){ 
      System.out.println("tweet ke-"+i); 
      String sql1 = "SELECT tweet,date,location FROM tweet WHERE tweet_id='"+i+"'"; 
      ResultSet rs2 = stmt.executeQuery(sql1); 

      while(rs2.next()){ 
       tweet = rs2.getString("tweet"); 
       date = rs2.getString("date"); 
       location = rs2.getString("location"); 
      } 
      System.out.println("Tweet: " + tweet); 
      removeStopWords(tweet, i, date, location); 


      final int currentValue = i; 
      try{ 
       SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         jProgressBar1.setValue(currentValue); 
        } 
       }); 
       java.lang.Thread.sleep(100); 
      }catch (InterruptedException e) { 
       //JOptionPane.showMessageDialog(frame, e.getMessage()); 
      } 
     } 
    }catch(SQLException se){ 
     //Handle errors for JDBC 
     se.printStackTrace(); 
    }catch(Exception e){ 
     //Handle errors for Class.forName 
     e.printStackTrace(); 
    }finally{ 
     //finally block used to close resources 
     try{ 
      if(stmt!=null) 
      conn.close(); 
     }catch(SQLException se){}// do nothing 
     try{ 
      if(conn!=null) 
      conn.close(); 
     }catch(SQLException se){ 
      se.printStackTrace(); 
     }//end finally try 
    }//end try 
} 

. 내가 놓친 것?, 제발 도와주세요.

답변

0

Thread으로 작업을 처리해야합니다. 그렇지 않은 경우 repaint 메서드가 호출 된 주 스윙 스레드를 차단합니다. 또한 코드에 ProgressBar이 표시되지 않으므로 작업 단계가 수행 될 때 해당 값을 업데이트해야합니다.

SwingUtilities.invokeLater(
    new Runnable(
     public void run() { 
      for(int i=initial_number;i<row;i++){ 
       System.out.println("tweet ke-"+i); 
       String sql1 = "SELECT tweet,date,location FROM tweet WHERE tweet_id='"+i+"'"; 
       ResultSet rs2 = stmt.executeQuery(sql1); 

       while(rs2.next()){ 
        tweet = rs2.getString("tweet"); 
        date = rs2.getString("date"); 
        location = rs2.getString("location"); 
       } 
       System.out.println("Tweet: " + tweet); 
       removeStopWords(tweet, i, date, location); 

       jTextArea1.append(toTextArea); 
       // the JProgressBar must have been instantiated 
       // as new JProgressBar(initial_number,row - 1) 
       jProgressBar1.setValue(i); 
      } 
    })); 
+0

진행 막대가 공공 무효 실행에() {} –

+0

@MuhammadHaryadiFutra : 예, 지금 당신이 그것을 추가 한 것이다. 사실, 당신은 메소드 메쏘드 전체를'Runnable' ('ProgressBar'를 가진 부분조차도)에두고 실행시켜야합니다. – Dici

+0

나는 그것을하는 법을 모른다, 나는 찔 렸다 –

0

오랫동안 실행되는 작업에 SwingWorker를 사용하면 작업을 더 쉽게 할 수 있습니다.

public void selectTweet() 
{ 
    final int initial_number = Integer.parseInt(jTextField4.getText()); // This should be done outside of the worker because you are accessing a UI element's data. 
    SwingWorker<Void, int[]> worker = new SwingWorker<Void, int[]>() 
    { 
     @Override 
     protected Void doInBackground() throws Exception 
     { 
      Connection conn = null; 
      Statement stmt = null; 
      try 
      { 
       Class.forName("com.mysql.jdbc.Driver"); 
       conn = DriverManager.getConnection(DB_URL, USER, PASS); 
       stmt = conn.createStatement(); 

       String sql = "SELECT COUNT(*) FROM tweet"; 
       ResultSet rs = stmt.executeQuery(sql); 
       int row = 0; 
       while(rs.next()) 
       { 
        row = rs.getInt("COUNT(*)"); 
       } 

       for(int i = initial_number; i < row; i++) 
       { 
        System.out.println("tweet ke-" + i); 
        String sql1 = "SELECT tweet,date,location FROM tweet WHERE tweet_id='" + i + "'"; 
        ResultSet rs2 = stmt.executeQuery(sql1); 

        String tweet, date, location; 
        while(rs2.next()) 
        { 
         tweet = rs2.getString("tweet"); 
         date = rs2.getString("date"); 
         location = rs2.getString("location"); 
        } 
        System.out.println("Tweet: " + tweet); 
        removeStopWords(tweet, i, date, location); 

        publish(new int[]{i,row}); 
       } 
      } 
      catch(SQLException se) 
      { 
       //Handle errors for JDBC 
       se.printStackTrace(); 
      } 
      catch(Exception e) 
      { 
       //Handle errors for Class.forName 
       e.printStackTrace(); 
      } 
      finally 
      { 
       //finally block used to close resources 
       try 
       { 
        if(stmt != null) 
         conn.close(); 
       } 
       catch(SQLException se) 
       { 
       }// do nothing 
       try 
       { 
        if(conn != null) 
         conn.close(); 
       } 
       catch(SQLException se) 
       { 
        se.printStackTrace(); 
       }//end finally try 
      }//end try 
     } 

     @Override 
     protected void process(List<int[]> chunks) // Run in the EDT, so no invokeLater needed 
     { 
      if(chunks == null || chunks.isEmpty()) 
       return; 
      int[] last = chunks.get(chunks.size() - 1); 
      jProgressBar1.setMinimum(0); 
      jProgressBar1.setMaximum(last[1] - initial_number); 
      jProgressBar1.setValue(last[0] - initial_number); 
     } 

     @Override 
     protected void done() // Run in the EDT, so no invokeLater needed 
     { 
      jProgressBar1.setValue(jProgressBar1.getMaximum()); 
     } 
    }; 
    worker.execute(); 
} 
관련 문제