2014-09-15 2 views
0

Я хочу показать запись из базы данных по строкам в TextArea.Как показать запись из базы данных в TextArea в строке java по строке

я попытался это:

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

     jTextField2.setText("" + row); 
     jProgressBar1.setMaximum(row); 
     jProgressBar1.setStringPainted(true); 

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

      while(rs2.next()){ 
       tweet = rs2.getString("tweet"); 
       date = rs2.getString("date"); 
       location = rs2.getString("location"); 
      } 

      jTextArea1.append(i + ") " + tweet + "\n"); 

      jProgressBar1.setValue(i); 
      number++; 
     } 

, но это дает мне выход сразу весь процесс закончил, помочь мне. Я хочу показать выходное исполнение по строкам, а не всем вместе. и как использовать индикатор выполнения?

+0

[ 'SwingWorker'] (Http: // документы. oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html) - это то, что вам нужно :) – NiziL

+0

как использовать SwingWorker? –

+0

Ссылка, которую я вам даю (javadoc), содержит несколько хороших примеров ... Но я пишу ответ сейчас;) – NiziL

ответ

1

Ну, цель SwingWorker состоит в том, чтобы обрабатывать вычисления в другом потоке и, таким образом, позволяет избежать некоторого уродливого замораживания в вашем приложении swing (взгляните на тему Dispatch Event).

Есть несколько методов известных:

  • doInBackground(), основная часть вашего SwingWorker, будет делать вычисления
  • publish(V... chunks), позволяет публиковать некоторую часть результата в процессе вычисления
  • process(List<V> chunks), позволяет делать то, что вы хотите, получая часть результата.
  • get(), дайте окончательный результат, когда вычисление завершено.

В SwingWorker<V, K>, V является типом конечного результата, и K типа куска.

Вот SwingWorker, который должен работу за вас, надеюсь, что это помогает :)

public class TweetWorker extends SwingWorker<Integer, String> { 

    private JTextField field; 
    private JTextArea area; 
    private JProgressBar bar; 

    private int progress = 0 ; 

    public TweetWorker(JTextField yourField, JTextArea yourArea, JProgressBar yourBar) { 
    field = yourField; 
    area = yourArea; 
    bar = yourBar; 
    } 

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

    field.setText("" + row); 
    bar.setMaximum(row); 
    bar.setStringPainted(true); 

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

     while(rs2.next()){ 
     tweet = rs2.getString("tweet"); 
     date = rs2.getString("date"); 
     location = rs2.getString("location"); 
     } 

     publish(i + ") " + tweet + "\n"); 
    } 
    return row; 
    } 

    @Override 
    public void process(List<String> chunks){ 
    for(String s : chunks) { 
     area.append(s); 
    } 
    progress+=chunks.size(); 
    bar.setValue(progress); 
    } 

} 

Извините за мой бедный английский;)

+0

Я не могу его использовать, потому что я делаю это когда i klik на кнопке, поэтому я не знаю, как использовать этот код :( –

+0

добавьте этот класс в свой проект и замените свой код в слушателе на 'new TweetWorker (jTextField2, jTextArea1, jProgressBar1) .execute()' – NiziL