java - 无法刷新 JFrame

标签 java multithreading swing timer event-dispatch-thread

我有一个简单的 JFrame,其中包含一个 JButton 和一个 JLabel

public class Frame extends JFrame {
    public Frame() {
        initComponents();
        this.frameExample = new JFrameExample(jLabel1,jPanel1);
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {
        //this method only place the button and the label to the frame, it is auto-genereted by Netbeans tool.
    }

    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
        frameExample.count();
    }

    public static void main(String args[]) {
        new Frame().setVisible(true);
    }

    JFrameExample frameExample;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
}

我有一个简单的类,它通过构造函数获取 label 对象,并使用 count() 方法为标签设置一些值。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class JFrameExample {
    public JFrameExample(JLabel label, JPanel panel) {
        this.label = label;
        this.panel = panel;

        setFrameRefreshTimer();
    }

    public void setFrameRefreshTimer() {
        frameTimer = new Timer (100,new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                label.revalidate();
                label.repaint(); 
                panel.revalidate();
                panel.repaint();  
                System.out.println(label.getText());//doesn't print anything
                }
            });
    }

    public void count() {
        frameTimer.start();

        for (int i = 0; i <= 10; i++) {
            label.setText(i + "");

            try {
                Thread.sleep(500);
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }

        frameTimer.stop();

    }
    private JLabel label;
    private JPanel panel;
    private Timer frameTimer;
}

问题是,我想在 count() 方法调用 labelsetText() 方法时查看数字。但框架不刷新。最后我只看到数字10。我没有看到其他数字。

我使用了计时器,但没有帮助。我使用定时器错误吗?还有其他解决办法吗?我考虑过多线程,但我无法让它发挥作用。如果有人能帮助我解决这个问题,我将不胜感激。

注意:我用这个示例简化了我的问题,因此包含更改构造函数参数或类似内容的解决方案不会为我提供解决方案。

最佳答案

使用 setRepeat(true) 重复计时器方法,并在重复 10 次后通过调用 actionPerformed() 方法内的 stop() 方法中断循环。

示例代码:

private int counter = 0;
private Timer timer;
...

timer = new javax.swing.Timer(500, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        counter++;
        if(counter==10){
            timer.stop();
        }else{
            label.setText(counter + "");  
        }
    }
});
timer.setRepeats(true);
timer.start();

注意:

不要使用有时会挂起整个 swing 应用程序的 Thread.sleep() ,而是尝试使用 Swing Timer最适合 Swing 应用。

了解更多 How to Use Swing Timers

关于java - 无法刷新 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863698/

相关文章:

java - 并行运行 100 个线程,如果之前的一些线程已完成,则运行缺失的线程

c# - 为什么我们不能更改 ThreadPool 线程的单元状态,为什么我们在使用 ShowDialog 时不需要消息泵?

Ruby 多线程 ping 仅当存在多个线程时才会丢失数据包

java不合理的jtextfield大小问题

java - RxJava 线程安全

java - 以编程方式为 JBoss 4.2.x 创建数据源

java - 在布局内的组件上 Swing getLocationOnScreen 方法

Java Swing 和 AWT - 鼠标位置不准确

java - 更改部署在 tomcat 中的应用程序的上下文根

java - Activity 重新启动时如何保存编辑文本字段