2012-04-01 38 views
2

我有一个主类(它基本上是一个NetBeans形式;拖放)从我的应用程序启动的位置和另一个类(称为类2),我的函数驻留。我首先调用一个函数class2从我的主要方法和该方法有一个while循环递增计数器。取决于该计数器,我调用我的主类的函数,并尝试显示计数器在文本字段中,也st进度条在中间但它不工作尽管它显示正确的打印语句(计数器)。jTextfield和进度条不起作用

一些代码我加入它给我的问题,因为它既不更新也不进度更新textfield.Kindly帮我这究竟是为什么

我已编辑的代码,但它仍然显示没有什么:(

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

现在,这里是从其中i调用函数存在于其它类的主要方法()的代码被上面给出)

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 
} 
+2

你在count中创建'NewJFrame'类的New Object er3()'方法,每个'while'循环迭代。创建只有一个实例,并使用该实例更新值:-) – 2012-04-01 09:13:22

+0

我们再次去... – 2012-04-01 09:22:15

+0

@GagandeepBali哦,是的,你的权利,但它仍然没有显示任何内容:( – Xara 2012-04-01 09:22:40

回答

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); 
    } 
} 
+0

if(counter == 10)中的语句导致jProgressbar具有私人访问权限的错误。我对这些语句发表了评论。现在会发生什么,它只显示数据包10的结果,数据包10处理的结果。我试图把条件,如果(计数器> = 0),但不起作用.... – Xara 2012-04-01 11:05:26

+0

不,你只需要使用一个SwingWorker,如果你在'while'循环中做的所谓thingy是一项艰巨的任务,这个例子只是为了告诉你,while循环阻塞了你的EDT,只是为了更新你需要的JProgressBar。在'SwingWorker Thread'内部的''while'循环内部执行这个任务,这样你的'Swing'应用程序就可以和用户交互,永远不会冻结。当你删除该条件时,你的while循环继续,这会阻止你的EDT并且你的应用程序冻结。 – 2012-04-01 11:26:37

+0

@Zara:请观看我的最新编辑,我使用了SwingWorker,它可以让你在运行时更新你的'JTextField' :-) – 2012-04-01 14:00:43

3

您已经得到问题与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"); 
    } 
}); 
+0

通过这样做,它首先要求我做出最后的决定;我做到了,但它仍然没有显示任何内容:( – Xara 2012-04-01 09:11:07

+0

+1,对于SwingWorker是需要小时的,在这种情况下:-) – 2012-04-01 09:44:36