如何在java中使用进度条?

如何在java中使用进度条?,java,loops,process,progress,Java,Loops,Process,Progress,我想在JavaGUI中显示进度条中的进度,但在流程完成之前,进度不会显示任何内容 这是我的尝试: public void selectTweet(){ Connection conn = null; Statement stmt = null; try{ Class.forName("com.mysql.jdbc.Driver"); conn = Drive rManager.getConnection(DB_URL, USER

我想在JavaGUI中显示进度条中的进度,但在流程完成之前,进度不会显示任何内容

这是我的尝试:

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
}
public void selectTweet(){
连接conn=null;
语句stmt=null;
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
conn=驱动器
rManager.getConnection(数据库URL、用户、通行证);
stmt=conn.createStatement();
//蒙吉顿朱姆拉查询pada表推文
String sql=“从tweet中选择COUNT(*)”;
结果集rs=stmt.executeQuery(sql);
int行=0;
while(rs.next()){
行=rs.getInt(“计数(*));
}
int initial_number=Integer.parseInt(jTextField4.getText());

对于(int i=initial_number;i您需要在一个单独的
线程中处理任务。如果不这样做,您将阻止调用
repaint
方法的主Swing线程。此外,我在代码中没有看到任何
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); 
          }
    }));
SwingUtilities.invokeLater(
新Runnable(
公开募捐{

对于(inti=initial_number;i,在长时间运行的任务中使用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();
}
public void selectTweet()
{
final int initial_number=Integer.parseInt(jTextField4.getText());//这应该在工作进程之外完成,因为您正在访问UI元素的数据。
SwingWorker worker=新SwingWorker()
{
@凌驾
受保护的Void doInBackground()引发异常
{
连接conn=null;
语句stmt=null;
尝试
{
Class.forName(“com.mysql.jdbc.Driver”);
conn=DriverManager.getConnection(DB_URL,USER,PASS);
stmt=conn.createStatement();
String sql=“从tweet中选择COUNT(*)”;
结果集rs=stmt.executeQuery(sql);
int行=0;
while(rs.next())
{
行=rs.getInt(“计数(*));
}
对于(int i=初始值;i
progressbar处于public void run(){}@MuhammadHaryadiFutra:是的,现在您已经添加了它。事实上,您应该将整个方法体放在一个
Runnable
(甚至是带有
progressbar
的部分)中并运行它。我不知道怎么做,我是stucki编辑了我的问题,请看一看,并帮助我:(@Dici)任何更新进度条的调用都应该使用
SwingUtils.invokeLater
进行,否则您会看到奇怪的行为,因为swing方法很少是线程安全的。