我在程序中使用JLabel来显示讯息。比如:JLabel msg = new JLabel("Do?");
此时显示的是“Do?”,之后我想在程序运算时让它显示“procesing...”,所以我把msg.setText("processing...");这一句加入运算开始程序的前面,然后在运算结束后,显示结果的同时,显示说“done!” 我就把msg.setText("done!");这一句加在运算程序结束后。应该是这样吧?可是为什么运行后,当运算的时候不显示procesing...,直接跳到done!就不变了。这是怎么回事?啥问题呢?会有时间差的问题吗?谢谢各位帮助!!

解决方案 »

  1.   

    可能是你的计算量太小
    时间太短 所以你看 不到processing而直接跳到DONE
    你可以在显示processing后加一局
    Thread.sleep(1000);
    让程序睡眠一秒
    就可以看到效果了
      

  2.   

    你如果不想让别人觉得你的东西算的慢的话.
    就直接Thread.sleep(300)吧..在processing之后.
      

  3.   

    恩应该是时间太短啊
    你没能看到啊
    加个sleep()就可以了啊
      

  4.   

    千万别加 sleep 否则 sleep 期间界面会失去响应!!!因为事件处理线程被阻塞了!
      

  5.   

    很简单,我曾经做个一个更你类似的功能后台发生数据删除的时候提示用户,删完了再提示用户结果后台删得太快了,直接就提示删完了,没提示开始删除(视觉上的)其实程序是执行了你的设置文本的代码的,只是你看不出来你可以做一个实验,在processing和Done之间加入一个大数据量的运算代码
    for(int i = 0; i<10000000; i++)
    {
        i + = 1;
    }
    你就可以看到效果了或者把运算放入一个线程里,执行之后让线程sleep一下
      

  6.   

    谢谢各位的答复!!可是好像不是计算太快的问题,因为运算量比较大,用的时间还是挺长的,我都要等5-8秒左右,按说等的时候就应该显示processing,运行完成后显示done.可是一直显示done,计算时界面好象临时停住,等运行完成后显示结果。但是一直都显示done.还会是什么原因呢?谢谢大家啦
      

  7.   

    如果不是计算时间的问题,那会不会是界面没有刷新的原因啊,要不你试试在msg.setText("processing...");后加一句
    msg所在面板Jpanel.repaint()看看效果
      

  8.   

    都试过了,还是不行啊!5555msgPanel = new JPanel();
    msg = new JLabel("Do?");
    msg.setHorizontalAlignment(JLabel.LEFT);
    msgPanel.add(msg);
    cont.add(msgPanel, BorderLayout.SOUTH);利用一个JButton来开始运算:
    class ActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
           msg.setText("processing..."); //我就是加在这里,从开始运算想显示processing...//以下是大家建议的都试过了,不管用,按下按钮后界面好像失去响应,button变色,直到运算完成后恢复正常。但从头到尾显示done.
    //      progressPanel.repaint();  
    // for(int i = 0; i<10000000; i++) 
    //      {
    //      i += 1; 
    //      } 
        
        
         angle = ((Number) spinnerA.getValue()).intValue();           
         N = ((Number) spinnerN.getValue()).doubleValue();           
         K = Math.exp(((Number) spinnerK.getValue()).doubleValue());           
    processImage();
       
        }
    }

    public void processImage()
    {

    imgSel.setEnabled(false);
    spinnerA.setEnabled(false);
    spinnerN.setEnabled(false);
    spinnerK.setEnabled(false);

    imgRestaured = new ImagePlus("",img[imgNumber].getProcessor().duplicate());
    FiltradoWiener.transformImage(imgRestaured, angle, (int)N, N, K);
    restaurationLabel.setIcon(new ImageIcon(imgRestaured.getImage()));

    spinnerA.setEnabled(true);
    spinnerN.setEnabled(true);
    spinnerK.setEnabled(true);
    imgSel.setEnabled(true);

    msg.setText("Done"); //按说应该在所有计算完成后这里显示Done.
    }

    还哪里有可能不对吗?谢谢
      

  9.   


    下面是我写的一个小例子,你看看你要的是不是这种效果package demo;import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingConstants;public class DemoForAngle extends JFrame implements Runnable{ JLabel doLabel;
    JButton button;
    Thread thread=new Thread(this);
    /**
     * Launch the application
     * @param args
     */
    public static void main(String args[]) {
    try {
    DemoForAngle frame = new DemoForAngle();
    frame.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    } /**
     * Create the frame
     */
    public DemoForAngle() {
    super();
    getContentPane().setLayout(null);
    setBounds(100, 100, 353, 278);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JPanel panel = new JPanel();
    panel.setLayout(null);
    panel.setBounds(0, 0, 343, 240);
    getContentPane().add(panel);
    doLabel = new JLabel();
    doLabel.setHorizontalAlignment(SwingConstants.CENTER);
    doLabel.setText("Do?");
    doLabel.setBounds(96, 61, 145, 43);
    doLabel.addFocusListener(new doLabelFocusListener());
    panel.add(doLabel);

    button = new JButton();
    button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
     doLabel.setText("processing...");
     doLabel.requestFocusInWindow();
    }
    });
    button.setText("运算");
    button.setBounds(115, 151, 99, 23);
    panel.add(button); }
        private void doSomeThing()
        {     
       //这里写你要进行数据处理代码
        }
        class doLabelFocusListener implements FocusListener
        {
    public void focusGained(FocusEvent e) {
    doSomeThing();
    try {
    //该时间可根据实际进行修改
    thread.sleep(3000);
    } catch (InterruptedException e1) {
    e1.printStackTrace();
    }
    button.requestFocusInWindow();
    }
    public void focusLost(FocusEvent e) {
    doLabel.setText("Done");
    }    }
        public void run()
        {
        
        }
    }
      

  10.   

    给各具土的方法
    import javax.swing.JFrame;
    import javax.swing.JLabel;public class LabelDisplayTest extends JFrame { private JLabel label = new JLabel(); public LabelDisplayTest() {
    this.getContentPane().add(this.label);
    this.label.setText("Do?");
    } @SuppressWarnings("static-access")
    public void test() {
    Thread t = new Thread(new Runnable() {
    public void run() {
    label.setText("Processing...");
    }
    });
    try {
    t.sleep(3000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    t.start();
    try {
    t.sleep(3000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    t.stop();
    label.setText("Done.");
    } /**
     * @param args
     */
    public static void main(String[] args) {
    LabelDisplayTest ldt = new LabelDisplayTest();
    ldt.setVisible(true);
    ldt.setSize(200, 200);
    ldt.setDefaultCloseOperation(EXIT_ON_CLOSE);
    ldt.test();
    }}
      

  11.   

    19楼的达人做出的效果正是我想要的,可是照着你的模式套进我的程式,这次processing...有了,可是不done了。数据处理完成后依然是processing....
    而且在button.requestFocusInWindow(); 开始出现error。
    天哪!没那么复杂啊,这次怎么总出问题。会是什么问题呢?不胜感激!
      

  12.   

    如果你的计算时间长到足够能看到processing....到Done,最短应该有2000毫秒吧,那你可以把
    thread.sleep(3000); 改为thread.sleep(1000);或更小,这样可能很快就看到效果了,
    如果button.requestFocusInWindow(); 出错可以试试
    button.requestFocus(true); 
    或者你把error贴出来我看看啊
      

  13.   

    我改用button.requestFocus(true); 还是出现同样的问题。部分程序:
    public class Applet3Botton extends JApplet {
    JPanel progressPanel;
    JButton button;
    public void init() {

    progressPanel = new JPanel();
    progressPanel.setBackground(new Color(192,204,226));
    progressPanel.setLayout(new GridLayout(2,1)); JButton button = new JButton("DO?");
    button_restaurar.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e) {
    msg.setText("processing...");
    msg.requestFocus();
    }
    }

    );
    controlPanel.add(button); msg = new JLabel("Hello!");
    msg.setHorizontalAlignment(JLabel.LEFT);
    msg.addFocusListener(new msgLabelFocusListener());
    progressPanel.add(msg); cont.add(progressPanel, BorderLayout.SOUTH);
    }  class msgLabelFocusListener implements FocusListener
         {
         public void focusGained(FocusEvent e) 
         {
    processImage();//这个sleep是必须要吗?我的计算时间够显示processing,是不是就不需要了?
    //     try {
    //    
    //     thread.sleep(3000); 
    //     } catch (InterruptedException e1) 
    //     {
    //     e1.printStackTrace();
    //     }

    button.requestFocus(true);
        
         }
         public void focusLost(FocusEvent e) 
    {
         msg.setText("Done");
         }
         } public void processImage()
    {
    }
    }现在情况是这样的:
    运行applet后,显示Hi
    点击button后,显示processing...并开始计算
    计算完成后,界面上会显示结果,但是仍然是processing...,不显示done. 但是如果点击界面上其它组件,比如我的界面上还有JSpinner和JComboBox,点击它们,才会显示done.另外,还有一个问题,在计算完成后,不是继续显示processing吗,但是如果这个时候把窗口缩小化,再打开,会显示done,但是同时会自动重新进行一遍计算。这是怎么回事啊?这里是运行出现的错误:Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
    at applets.Applet3Botton$msgLabelFocusListener.focusGained(Applet3Botton.java:189)
    at java.awt.Component.processFocusEvent(Component.java:5390)
    at java.awt.Component.processEvent(Component.java:5257)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3968)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1826)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:845)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:485)
    at java.awt.Component.dispatchEventImpl(Component.java:3841)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)不胜感激!!!!!
      

  14.   

    “如果这个时候把窗口缩小化,再打开,会显示done,但是同时会自动重新进行一遍计算。 
    ”这是因为我是利用的是控件的焦点事件来控制程序的,因此当你将焦点再次给JLabel的时候, focusGained(FocusEvent e)中的程序自动执行, “如果点击界面上其它组件,比如我的界面上还有JSpinner和JComboBox,点击它们,才会显示done. 
    ”的原因也是一样,那你可以改用别的事件监听来实现,有时间我再给你写个例子
      

  15.   

    你是指“Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException 
    at applets.Applet3Botton$msgLabelFocusListener.focusGained(Applet3Botton.java:189)”吗?
    应该是在自动执行 focusGained();时有对象未赋值吧!如果你是用了下面语句的话可能是thread为null,
    //    try { 
    //    
    //    thread.sleep(3000); 
    //    } catch (InterruptedException e1) 
    //    { 
    //    e1.printStackTrace(); 
    //    } 
    这句话的意思就是让当前线程休眠3秒。如果你计算函数的运行时间大于2秒即可以让用户看到由processing...到Done的变化,可以不写这个,但要写的话,你的类要实现Runnable接口才行
    其实Swing中有很多控件的监听器可以用在这里实现你的目的,你可以考虑用别的监听器来实现,我这里就是利用了一个焦点时间来实现的,即焦点在JLabel是进行计算,计算完成后将焦点赋给别的控件这样可以使
     public void focusLost(FocusEvent e) 

        msg.setText("Done"); 
        } 
    自动执行,也就是相当与加了一个监听器,当你计算完成后执行计算完成后的处理代码,你可以试试别的方法实现这一功能!
      

  16.   

    我认为这应该是一个面向过程和面向对象的区别吧,LZ所写的是不是都是过程代码,譬如执行一for循环是一闪即逝的,用户完全看不到是怎么执行的.这就是面向过程,如果程序运行取决于用户的输入,譬如当响应特定的鼠标键盘事件之后程序会根据输入做出运行结果,这就是面向对象的.
      

  17.   

    回复27楼的朋友:我最后没有使用thread.sleep();因为计算均在2秒以上,出现错误,可能像你说的,是别的对象赋值吧,我再检查检查。谢谢你!Swing中的控件的监听器还有哪些呢?
      

  18.   

    回复28楼的朋友:我想执行的应该是过程代码吧,计算时间不取决于用户的输入,有很多for循环,但是我所做的处理是关于图像的,要取出每个像素的值,进行一系列的计算,再储存起来,形成新图像。计算量比较大,当然也要看图像的大小,但所用时间不会低于2秒。
      

  19.   

    学习了,收藏...
    JAVA资料太多?选中想收藏的文字(图片),右键选“收录到易载”,搞定!
      

  20.   

    回复楼主关于“Swing中的控件的监听器还有哪些呢?”
    控件监听器接口有
    Action, ActionListener, AdjustmentListener, AncestorListener, AWTEventListener, BeanContextMembershipListener, BeanContextServiceRevokedListener, BeanContextServices, BeanContextServicesListener, CaretListener, CellEditorListener, ChangeListener, ComponentListener, ConnectionEventListener, ContainerListener, ControllerEventListener, DocumentListener, DragGestureListener, DragSourceListener, DragSourceMotionListener, DropTargetListener, FlavorListener, FocusListener, HandshakeCompletedListener, HierarchyBoundsListener, HierarchyListener, HyperlinkListener, IIOReadProgressListener, IIOReadUpdateListener, IIOReadWarningListener, IIOWriteProgressListener, IIOWriteWarningListener, InputMethodListener, InternalFrameListener, ItemListener, KeyListener, LineListener, ListDataListener, ListSelectionListener, MenuDragMouseListener, MenuKeyListener, MenuListener, MetaEventListener, MouseInputListener, MouseListener, MouseMotionListener, MouseWheelListener, NamespaceChangeListener, NamingListener, NodeChangeListener, NotificationListener, ObjectChangeListener, PopupMenuListener, PreferenceChangeListener, PropertyChangeListener, RowSetListener, SSLSessionBindingListener, TableColumnModelListener, TableModelListener, TextListener, TreeExpansionListener, TreeModelListener, TreeSelectionListener, TreeWillExpandListener, UndoableEditListener, UnsolicitedNotificationListener, VetoableChangeListener, WindowFocusListener, WindowListener, WindowStateListener 
    楼主可以通过查询JDK文档看看
      

  21.   

    我个人觉得常用的有ActionListener、CellEditorListener, ChangeListener、FocusListener(焦点)、DocumentListener
    MouseListener, MouseMotionListener, MouseWheelListener(鼠标), WindowFocusListener, WindowListener, WindowStateListener(窗口),ItemListener, KeyListener(键盘)
    楼主的"SetText()"问题是否已解决?
      

  22.   

    很感谢bsr1983!资料很全。暂时还没有解决,还在尝试中
      

  23.   

    你好,麻烦问一下,这个问题应该怎么解决啊?我也遇到了JLabel中setText()不能及时显示,最后程序结束的时候才显示“程序结束”,而运行时不显示“正在运行”,谢谢了!