2012-04-01 2 views
2

У меня есть основной класс (который в основном является формой netbeans, перетаскиванием), откуда начинается мое приложение, и другим классом (назовите его классом 2), где находятся мои функции. Сначала я вызываю функцию в class2 из моего основного метода, и этот метод имеет цикл while, который увеличивает счетчик. В зависимости от этого счетчика я вызываю функцию моего основного класса и пытаюсь отобразить счетчик в текстовом поле, а также st progress progress в промежуточном, но он не работает хотя он корректно показывает операторы печати (счетчик).jTextfield и progressbar не работают

Часть коды я добавив, что не дает мне проблемы, как это ни обновление прогрессбара ни обновив textfield.Kindly помочь мне, почему это происходит

я отредактировал код, но до сих пор он ничего не отображает :(

public class NewClass 
{ 
    public static int counter = 0; 
    public NewJFrame p = new NewJFrame(); 
    public void packet() 
    { 
     try 
     { 
      while (true) 
      { 
       //some code ,right now which i have omitted 
       counter = counter + 1; 
       counter2(counter); 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public void counter2(int counter) 
    { 
     counter3(); 
    } 

    public void counter3() 
    { 

     p.progress(counter); 
    } 
} 

Теперь здесь является основным методом, откуда я вызывайте функции присутствуют в другом классе() код, который приведен выше)

public class NewJFrame extends javax.swing.JFrame 
{ 

    /** Creates new form NewJFrame */ 
    public NewJFrame() 
    { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    public void progress(int y) 
    { 
     jProgressBar1.setIndeterminate(true); 
     jTextField1.setText(y+"packets processed"); 
     System.out.println(y); 
    } 

    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) 
    {  
     NewClass m=new NewClass(); 
     m.packet(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) 
    {   
     try 
     { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     java.awt.EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new NewJFrame().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify 
    private javax.swing.JButton jButton1; 
    private javax.swing.JProgressBar jProgressBar1; 
    private javax.swing.JTextField jTextField1; 
    // End of variables declaration 
} 
+2

You создают новый объект вашего класса 'NewJFrame' внутри' count er3() 'с каждой итерацией цикла while. Создайте только один экземпляр и используйте этот экземпляр для обновления значений :-) –

+0

Там мы снова идем ... –

+0

@GagandeepBali О да, ур прав, но все равно ничего не отображает :( – Xara

ответ

4

Вот небольшой пример с SwingWorker поможет вам обновить JTextField на бегу:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class NewJFrame extends javax.swing.JFrame 
{ 

    /** Creates new form NewJFrame */ 
    public NewJFrame() 
    { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLocationByPlatform(true); 

     JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new BorderLayout()); 

     jTextField1 = new JTextField(10); 
     contentPane.add(jTextField1, BorderLayout.PAGE_START); 

     jProgressBar1 = new JProgressBar(0, 100);  
     contentPane.add(jProgressBar1, BorderLayout.CENTER); 

     jButton1 = new JButton("START"); 
     jButton1.addMouseListener(new MouseAdapter() 
     { 
      public void mouseClicked(MouseEvent me) 
      { 
       jProgressBar1.setIndeterminate(true); 
       jButton1MouseClicked(me); 
      } 
     }); 
     contentPane.add(jButton1, BorderLayout.PAGE_END); 

     setContentPane(contentPane); 
     pack(); 
     setVisible(true); 
    } 

    @SuppressWarnings("unchecked") 
    public void progress(final int y) 
    { 
     System.out.println("progress Method is working."); 
     /* 
     * This thing needs to be done on Event 
     * Dispatcher Thread. 
     */ 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       jTextField1.setText(y+"packets processed"); 
       System.out.println(y); 
      }   
     });   
    } 

    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) 
    {  
     NewClass m=new NewClass(this); 
     m.execute(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) 
    {   
     try 
     { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     java.awt.EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new NewJFrame().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify 
    private javax.swing.JButton jButton1; 
    public javax.swing.JProgressBar jProgressBar1; 
    private javax.swing.JTextField jTextField1; 
    // End of variables declaration 
} 

class NewClass extends SwingWorker<Void, Void> 
{ 
    public static int counter = 0; 
    // Added this variable to keep the instance. 
    private NewJFrame p; 
    private boolean flag = true; 

    public NewClass(NewJFrame frame) 
    { 
     p = frame; 
    } 

    public Void doInBackground() 
    { 
     while(flag) 
     { 
      counter = counter + 1; 
      counter2(counter); 
     } 
     return null; 
    } 

    public void done() 
    { 
     System.out.println("I am DONE"); 
    } 

    public void counter2(int counter) 
    { 
     counter3(); 
    } 

    public void counter3() 
    { 
     p.progress(counter); 
    } 
} 
+0

утверждения внутри if (counter == 10) вызывают ошибку, что jProgressbar имеет закрытый доступ. Я комментирую эти утверждения.Теперь, что происходит, что он отображает результат только для пакета 10, который обрабатывает пакет 10. Я попытался поставить условие вроде if (counter> = 0), но это не работает. – Xara

+0

Нет, вам просто нужно использовать SwingWorker, если так называемая вещь, которую вы делаете внутри цикла 'while', представляет собой огромную задачу, этот пример просто показывает вам, что ваш цикл while while блокирует ваш EDT, просто обновляя ваш' JProgressBar' вам нужно для выполнения этой задачи внутри цикла while в фоновом режиме внутри 'SwingWorker Thread', так что ваше приложение Swing может взаимодействовать с пользователем и никогда не замерзает. Когда вы удаляете это условие, цикл while продолжается, что блокирует ваш EDT и ваше приложение замерзает. –

+0

@ Zara: Посмотрите эту последнюю мою правую версию, я использовал SwingWorker, и она позволяет вам обновлять ваш JTextField на ходу :-) –

3

You есть проблемы с Concurency in Swing

строк кода

jProgressBar1.setIndeterminate(true); 
jTextField1.setText(y+"packets processed"); 

должен быть

java.awt.EventQueue.invokeLater(new Runnable() { 

    @Override 
    public void run() { 
     jProgressBar1.setIndeterminate(true); 
     jTextField1.setText(y + "packets processed"); 
    } 
}); 
+0

Делая это, он сначала просит меня сделать y final, я сделал это, но он все еще ничего не отображает :( – Xara

+0

+1, для SwingWorker нужен час, в данном случае :-) –