【问题标题】:jTextfield and progressbar not workingjTextfield 和进度条不起作用
【发布时间】:2012-04-01 08:58:50
【问题描述】:

我有一个主类(基本上是一个 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
}

【问题讨论】:

  • 您正在counter3() 方法内创建NewJFrame 类的新对象,每次迭代while 循环。只创建一个实例,并使用该实例来更新值:-)
  • @GagandeepBali 哦,是的,你是对的,但它仍然什么也没显示:(
  • @Zara :您在该示例中的 while 循环阻塞了 EDT,尝试添加类似 if (counter == 10) break; 的内容,如果您遵守我在上一条评论中的建议,它将打印出来 :-)。似乎while循环正是应该使用SwingWorker的情况
  • 这里JProgressBar Tutorials,一个很好的例子,与你的案例有关。看看它:-)
  • 当你的previous question with the same code 还不到 3 小时时,你为什么要开始一个新问题。如果您有新信息,只需编辑您之前的问题。

标签: java swing netbeans jtextfield jprogressbar


【解决方案1】:

这里有一个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);
    }
}

【讨论】:

  • if(counter==10) 中的语句导致 jProgressbar 具有私有访问权限的错误。我已注释掉这些语句。现在它只显示数据包 10 的结果,数据包 10 是已处理。我尝试设置 if(counter>=0) 之类的条件,但这不起作用....
  • 不不,你只需要使用 SwingWorker,如果你在 while 循环中做的所谓的事情是一项艰巨的任务,这个例子只是为了向你展示你的 @987654325 @循环阻塞了你的EDT,只是为了更新你的JProgressBar,你需要在SwingWorker Thread的后台的while循环内执行这个任务,这样你的Swing应用程序可以与用户交互并且永远不会冻结.当您删除该条件时,您的 while 循环会继续,这会阻止您的 EDT 并且您的应用程序会冻结。
  • @Zara : 请观看我的最新编辑,我使用过 SwingWorker,它可以让您在运行时更新您的 JTextField :-)
  • 非常感谢,它可以与我的代码一起使用!顺便说一句,在我看到你这篇文章之前,我正在学习如何使用 swingworker :)
  • 你很受欢迎,但请阅读 SwingWorker,因为我也在阅读,可能是我错过了一些东西,你可以抓住并应用 :-)。我是 SwingWorker 中的菜鸟 :-)
【解决方案2】:

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

【讨论】:

  • 通过这样做,它首先要求我将 y 设为最终;我这样做了,但它仍然没有显示任何内容:(
  • +1,因为 SwingWorker 是时间的需要,在这种情况下 :-)
猜你喜欢
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多