I have a main class(which is basically a netbeans form;drag and drop) from where my application starts and another class(call it class 2) where my functions resides.I first call a function in class2 from my main method and that method has a while loop which increments a counter.Depending on that counter i call a function of my main class and try to display the counter in a textfield and also st the progressbar in intermediate but it is not working though it shows the print statements correctly(the counter).
Some code i am adding it is giving me problem as it is neither updating the progressbar nor updating the textfield.Kindly help me why is this happening
i have edited the code but still it displays nothing :(
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);
}
}
Now here is the main method from where i call the functions present in other class()code of that is given above)
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
}
Here a small example with SwingWorker
will help you update your JTextField
on the run :
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);
}
}