Java jTextfield和progressbar不工作

Java jTextfield和progressbar不工作,java,swing,netbeans,jtextfield,jprogressbar,Java,Swing,Netbeans,Jtextfield,Jprogressbar,我有一个主类(基本上是一个netbeans表单;拖放)和另一个类(称为class 2)我的函数所在的位置。我首先从我的main方法调用class2中的一个函数,该方法有一个while循环,该循环递增一个计数器。根据该计数器,我调用我的main类的一个函数,并尝试在textfield中显示计数器,同时在中间显示progressbar,但它不起作用,尽管它显示了打印正确的陈述(计数器) 我添加的一些代码给我带来了问题,因为它既没有更新progressbar也没有更新textfield。请帮助我为什么

我有一个主类(基本上是一个netbeans表单;拖放)和另一个类(称为class 2)我的函数所在的位置。我首先从我的main方法调用class2中的一个函数,该方法有一个while循环,该循环递增一个计数器。根据该计数器,我调用我的main类的一个函数,并尝试在textfield中显示计数器,同时在中间显示progressbar,但它不起作用,尽管它显示了打印正确的陈述(计数器)

我添加的一些代码给我带来了问题,因为它既没有更新progressbar也没有更新textfield。请帮助我为什么会发生这种情况

我已经编辑了代码,但仍然没有显示任何内容:(

下面是我调用其他类()中函数的主要方法(上面给出的代码)

你对我有意见

代码行

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");
    }
});

下面是一个使用
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);
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类NewJFrame扩展了javax.swing.JFrame
{
/**创建新表单NewJFrame*/
公共NewJFrame()
{
setDefaultCloseOperation(关闭时退出);
setLocationByPlatform(真);
JPanel contentPane=新的JPanel();
setLayout(新的BorderLayout());
jTextField1=新的JTextField(10);
添加(jTextField1,BorderLayout.PAGE_START);
jProgressBar1=新的JProgressBar(0100);
添加(jProgressBar1,BorderLayout.CENTER);
jButton1=新JButton(“开始”);
jButton1.addMouseListener(新的MouseAdapter()
{
公共无效mouseClicked(MouseEvent me)
{
jProgressBar1.setUndeterminate(true);
JButton1MouseClacked(me);
}
});
contentPane.add(jButton1,BorderLayout.PAGE_END);
setContentPane(contentPane);
包装();
setVisible(真);
}
@抑制警告(“未选中”)
公共工程进度(最终竣工图)
{
System.out.println(“进度方法正在工作”);
/*
*这件事需要在活动中完成
*调度程序线程。
*/
SwingUtilities.invokeLater(新的Runnable()
{
公开募捐
{
jTextField1.setText(y+“已处理的数据包”);
系统输出打印项次(y);
}           
});         
}
私有void jButton1MouseClicked(java.awt.event.MouseEvent evt)
{    
新类别m=新类别(本);
m、 执行();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串参数[])
{         
尝试
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} 
捕获(例外e)
{
e、 printStackTrace();
}
invokeLater(new Runnable())
{
公开募捐
{
新建NewJFrame().setVisible(true);
}
});
}
//变量声明-不修改
私有javax.swing.JButton jButton1;
public javax.swing.JProgressBar jProgressBar1;
私有javax.swing.JTextField jTextField1;
//变量结束声明
}
类NewClass扩展SwingWorker
{
公共静态整数计数器=0;
//添加此变量以保留实例。
私有newjp框架;
私有布尔标志=true;
公共NewClass(NewJFrame)
{
p=框架;
}
公共无效doInBackground()
{
while(旗帜)
{
计数器=计数器+1;
柜台2(柜台);
}
返回null;
}
公众假期结束()
{
System.out.println(“我完成了”);
}
公共无效计数器2(内部计数器)
{
计数器3();
}
公众谘询委员会3()
{
p、 进度(计数器);
}
}

通过这样做,它首先要求我进行y-final;我这样做了,但它仍然没有显示任何内容:(+1,因为SwingWorker是当前的需要,在本例中:-)您正在
NewJFrame
类的
counter3()
方法中创建一个新对象,每次迭代
while
循环。只创建一个实例,并使用该实例来更新值:-)@GagandeepBali哦,是的,但它仍然没有显示任何内容:(@Zara:该示例中的while循环正在阻止EDT,请尝试添加类似于
的内容,如果(counter==10)break;
则它将打印,如果您坚持我在前面的注释中建议的内容:-)。看起来,虽然循环正是应该在这里使用a的情况,但有一个非常好的例子,与您的案例相关。看看它:-)当你的孩子还不到3小时大的时候,你为什么要开始一个新的问题呢。如果您有新的信息,只需编辑上一个问题。If(counter==10)中的语句会导致错误,即jProgressbar具有私有访问权限。我已对这些语句进行了注释。现在发生的情况是,它只显示数据包10处理的结果。我尝试设置条件,如If(counter>=0)但这不起作用……不,不,你只需要使用SwingWorker,如果你在
while
循环中做的所谓的事情是一项艰巨的任务,这个例子只是告诉你你的
while
循环阻塞了你的EDT,只需更新
JProgressBar
,您需要在
中执行此任务,而
SwingWorker线程
中的后台循环,这样您的
Swing
应用程序就可以与用户交互,并且永远不会冻结。当您删除该条件时,while循环将继续,这将阻止您的EDT和应用程序冻结。@Zara
java.awt.EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
        jProgressBar1.setIndeterminate(true);
        jTextField1.setText(y + "packets processed");
    }
});
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);
    }
}