如何同时运行Swing.timer而不会出现延迟或性能下降

时间:2014-04-07 07:31:58

标签: java swing timer

我们如何同时运行多个Swing.timer?

我的应用程序是当我点击我的jframe按钮时它将执行两个swing计时器并同时运行,但看起来这个动作会让我的应用程序运行得很慢而且滞后。

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 

//************first swing timer execution************************ 

   ActionListener taskPerformer = new ActionListener() {
   public void actionPerformed(ActionEvent evt) {

       jLabel1.setText("Hello Girls");

            }
            };

javax.swing.Timer timer = new javax.swing.Timer( 0 , taskPerformer);
timer.setRepeats(true);
timer.start();     // execute first swing timer 


 //************second swing timer execution************************ 

ActionListener taskPerformer1 = new ActionListener() {
   public void actionPerformed(ActionEvent evt) {

       jLabel1.setText("Hello Guys");

            }
            };

javax.swing.Timer timer1 = new javax.swing.Timer( 0 , taskPerformer1);
timer1.setRepeats(true);
timer1.start(); //execute second swing timer
}             

我注意到如果我同时运行两个计时器,它将冻结我的应用程序。如何在没有冻结或延迟的情况下运行两个计时器?

1 个答案:

答案 0 :(得分:3)

0毫秒的延迟很可能会导致EDT发生Action个事件(以及setText调用产生的其他更新事件)。

您需要为EDT提供喘息的空间,不仅要处理您的Action事件,还要处理这些事件的后果,例如

Timer

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TimerExample {

    public static void main(String[] args) {
        new TimerExample();
    }

    public TimerExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class TestPane extends JPanel {

        private JLabel label;
        private JButton button;

        private Timer hisTimer;
        private Timer herTimer;

        public static final int DELAY = 1000;

        public TestPane() {
            setLayout(new BorderLayout());
            label = new JLabel();
            label.setHorizontalAlignment(JLabel.CENTER);
            button = new JButton("Start");

            hisTimer = new Timer(DELAY, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    label.setText("His");
                }
            });
            hisTimer.setInitialDelay(DELAY / 2);
            hisTimer.setCoalesce(true);

            herTimer = new Timer(DELAY, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    label.setText("Hers");
                }
            });
            herTimer.setCoalesce(true);

            button.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    if (hisTimer.isRunning() && herTimer.isRunning()) {
                        hisTimer.stop();
                        herTimer.stop();
                        button.setText("Start");
                    } else {
                        hisTimer.start();
                        herTimer.start();
                        button.setText("Stop");
                    }
                }
            });

            add(button, BorderLayout.SOUTH);
            add(label);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}