我有一个主类(基本上是一个netbeans形式;拖放)从我的应用程序启动的地方和另一个类(称为类2)我的函数所在的位置。我首先从我的main方法调用class2中的函数并且该方法有一个while循环,它递增一个计数器。根据该计数器,我调用我的主类的函数,并尝试在文本字段中显示计数器,并在中间的st进度条但它不工作虽然它显示打印陈述正确(柜台)。
我添加它的一些代码给我带来了问题,因为它既不更新进度条也不更新文本字段。请帮助我为什么会发生这种情况
我编辑了代码但仍然没有显示任何内容:(
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);
}
}
现在这里是我调用上面给出的其他class()代码中存在的函数的主要方法)
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
}
答案 0 :(得分: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);
}
}
答案 1 :(得分:3)
代码行
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");
}
});