如何在MouseEvent处理程序中立即更改jLabel的文本?

Pet*_*lký 3 java swing

我在使用鼠标动作事件处理程序中刷新swing组件时遇到问题.问题是在jButton1MouseClicked()完成之后,在此函数中更改的所有jLabel都可以看到它们的更改.这是我的功能:

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      

    int cycles = Integer.parseInt(c.settings.get("cycles"));
    statusMessageLabel.setText("Data collection in progress...");

    for(int i=1;i <= Integer.parseInt(c.settings.get("cycles"));i++) {

        jLabelCycle.setText(Integer.toString(i));

        //here are some functions which are implementing data collection


        if(i < cycles){
            int counter = Integer.parseInt(c.settings.get("interval"));
            while(counter >= 0){
                jLabelTimer.setText(Integer.toString(counter));
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(AppCView.class.getName()).log(Level.SEVERE, null, ex);
                }
                counter--;
            }
        }

    }
    statusMessageLabel.setText("Data collection has been finished.");
}    
Run Code Online (Sandbox Code Playgroud)

你能帮我么 ?我真的需要这些更改可以立即显示,因为一个jLabel可视化计数到下一个周期,第二个可视化实际周期数.在我改变它们之后,我尝试在所有jLabel上调用函数repaint(),但它没有帮助.

谢谢大家的帮助.

Tom*_*ine 6

在AWT中,与大多数其他GUI系统一样,包括重绘在内的所有事件都在一个线程上完成,即AWT事件调度线程(EDT).您在事件侦听器中阻止该线程,因此标签上的重绘事件无法通过.

我建议重写代码以使用javax.swing.Timer而不是使用Thread.sleep.

通常,长时间运行的操作应该在单独的线程上处理.任何涉及AWT或Swing组件的操作都应排队等待在AWT EDT上运行java.awt.EventQueue.invokeLater.