jTextfield и индикатор выполнения не работают

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

Некоторый код, который я добавляю, вызывает у меня проблемы, поскольку он не обновляет индикатор выполнения и не обновляет текстовое поле. Пожалуйста, помогите мне, почему это происходит.

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

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
}

person Xara    schedule 01.04.2012    source источник
comment
Вы создаете новый объект вашего класса NewJFrame внутри метода counter3() с каждой итерацией цикла while. Создайте только один экземпляр и используйте этот экземпляр для обновления значений :-)   -  person nIcE cOw    schedule 01.04.2012
comment
@GagandeepBali О да, ты прав, но все равно ничего не отображает :(   -  person Xara    schedule 01.04.2012
comment
@Zara: Ваш цикл while в этом примере блокирует EDT, попробуйте добавить что-то вроде if (counter == 10) break;, тогда он будет напечатан, если вы будете придерживаться того, что я предложил в предыдущем комментарии :-). Похоже, что цикл while — это как раз та ситуация, когда нужно использовать SwingWorker.   -  person nIcE cOw    schedule 01.04.2012
comment
Вот Учебники по JProgressBar, очень хороший пример, случай присутствует. Посмотри на это :-)   -  person nIcE cOw    schedule 01.04.2012
comment
@GagandeepBali, значит, нет другого способа исправить этот код без использования swingworker? кстати, где поставить это условие счетчика, потому что значение счетчика в соответствии с моим кодом всегда будет меняться...   -  person Xara    schedule 01.04.2012
comment
Посмотрите этот код, который я вставил как ответ, удалю его через некоторое время, изменив ваш код для печати значений :-)   -  person nIcE cOw    schedule 01.04.2012
comment
Почему вы начинаете новый вопрос, когда ваш предыдущий вопрос с тем же кодом не прошло и 3 часов. Если у вас есть новая информация, просто отредактируйте свой предыдущий вопрос.   -  person Robin    schedule 01.04.2012
comment
@ Робин, я отредактировал предыдущий вопрос, этот вопрос немного отличался от предыдущего ...   -  person Xara    schedule 01.04.2012


Ответы (2)


Вот небольшой пример с 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);
    }
}
person nIcE cOw    schedule 01.04.2012
comment
операторы внутри if (counter == 10) вызывают ошибку, что jProgressbar имеет частный доступ. У меня есть комментарий к этим операторам. Теперь, что происходит, он отображает результат только для пакета 10, который обрабатывается пакетом 10. Я попытался поставить условие, например if(counter›=0) но это не работает.... - person Xara; 01.04.2012
comment
Нет-нет, вам просто нужно использовать SwingWorker, если так называемая штука, которую вы делаете внутри своего цикла while, является огромной задачей, этот пример просто показывает вам, что ваш цикл while блокирует ваш EDT, просто чтобы обновить ваш JProgressBar вам нужно выполнить эту задачу внутри цикла while на фоне внутри SwingWorker Thread, чтобы ваше Swing приложение могло взаимодействовать с пользователем и никогда не зависало. Когда вы удаляете это условие, ваш цикл while продолжается, что блокирует ваш EDT, и ваше приложение зависает. - person nIcE cOw; 01.04.2012
comment
@Zara: Посмотрите это мое последнее редактирование, я использовал SwingWorker, и он позволяет вам обновлять свой JTextField на ходу :-) - person nIcE cOw; 01.04.2012
comment
Большое спасибо, это работает с моим кодом! Кстати, до того, как я увидел этот пост, я учился использовать свингворкер :) - person Xara; 01.04.2012
comment
Приветствую вас, но читайте SwingWorker, так как я тоже его читаю, возможно, я что-то пропустил, что вы можете поймать и применить :-). Я новичок в SwingWorker :-) - person nIcE cOw; 01.04.2012

У вас возникла проблема с параллельным доступом в 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");
    }
});
person mKorbel    schedule 01.04.2012
comment
Делая это, он сначала просит меня сделать y final; я сделал это, но все равно ничего не отображает :( - person Xara; 01.04.2012
comment
+1, в данном случае для SwingWorker нужен час :-) - person nIcE cOw; 01.04.2012