2016-01-28 5 views
0

Я создал графический интерфейс с использованием пакета swings, содержащего кнопку и текстовое поле, а также добавил обработку событий на кнопке, чтобы при нажатии на нее текстовое поле отображало сообщение непрерывно в течение 5 раз. находится в цикле.JTextfield looping text issue

public void actionPerformed(ActionEvent ae){ 
for(int i=0;i<5;i++){ 
tx.setText("Running"+i);// here tx is the JTextField object 
} 
+0

В чем проблема? – Satya

+0

Этот код не дает желаемого результата в соответствии с описанным выше описанием проблемы. – Isha

ответ

1

Если вы хотите показать это как анимацию, вы должны сделать это на фоне или в другом потоке.

здесь образец

private Task task; 
private void ButtonActionPerformed(java.awt.event.ActionEvent evt) 
{          
    task = new Task();   
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
    task.execute(); 
}          

class Task extends SwingWorker<Void, Void> 
{ 
    @Override 
    public Void doInBackground() throws Exception 
    { 
     for(int i=0;i<5;i++) 
     { 
      Lab.setText("Running"+i); 
      Thread.sleep(200); 
     } 
     return null; 
    } 
} 
+1

Компоненты Swing необходимо обновить в разделе «Диспетчер событий». Вы НЕ должны обновлять текст в методе doInBackground(), потому что этот код не работает в EDT. Вам нужно либо обернуть этот код в SwingUtilities.invokeLater (...), либо «опубликовать» текст, который вы хотите отобразить, а затем обновить текст в методе «процесс» SwingWorker. Ознакомьтесь с разделом из учебника Swing по [Concurrency] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html) для получения дополнительной информации и примеров SwingWorker. – camickr

0

Runnable Использование и положить нить внутри него ..

Runnable run = new Runnable() { 
     @Override 
     public void run() { 
      for(int i=0 ; i<5;i++){ 
       try { 
        Thread.sleep(1000);      //time to wait 
        jTextField_Cost.setText("Running"+i+""); 
       }catch(InterruptedException e1){ 
        e1.printStackTrace(); 
       } 
      } 
     } 
}; 
ExecutorService _ex = Executors.newCachedThreadPool(); 
_ex.execute(run); 

Вы также можете использовать

new Thread(run).start(); 

Но ExecutorService полезно, когда мы используем большое количество потоков в программе .. посмотрите this сообщение

+1

Этот фрагмент кода попытается обновить графический интерфейс из потока без GUI (большой нет-нет). Легче использовать Swing 'Timer' .. –