如何在java中使用进度条?
我想在JavaGUI中显示进度条中的进度,但在流程完成之前,进度不会显示任何内容 这是我的尝试:如何在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
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方法很少是线程安全的。