JFrame组件之间的触发延迟

时间:2013-01-21 04:13:11

标签: java swing timer jframe delay

我想展示如何使用JFrame直观地进行合并排序。我想要做的是使后续JLabel可见一段时间延迟。我尝试了很多方法,但所有这些都出现在同一时刻,没有中间延迟。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
       // jLabel1.setVisible(false);
        jLabel2.setVisible(false);
        jLabel3.setVisible(false);
        jLabel4.setVisible(false);
        jLabel5.setVisible(false);
        jLabel6.setVisible(false);
        jLabel7.setVisible(false);
        final Timer t=new Timer((4000), null);
         final int delay=2000;
        final ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {

          jLabel1.setVisible(true);
          t.getDelay();

          jLabel2.setVisible(true);
          t.setDelay(3000);

          jLabel3.setVisible(true);
          t.setDelay(2000);

          jLabel4.setVisible(true);
          t.setDelay(2000);

          jLabel5.setVisible(true);
          t.setDelay(2000);

          jLabel6.setVisible(true);
          t.setDelay(2000);
                }
  };

  new Timer(delay, taskPerformer).start();

但是当我点击按钮时,所有的标签出现在同一个momenet上,虽然我一直拖延。

2 个答案:

答案 0 :(得分:3)

您需要更新计时器动作监听器中的图标,如图here所示。您可以实现Icon界面来渲染大小与元素比较值成比例的图标,如here所示。

附录:你可以稍微具体一点吗?

您希望设置以某些初始随机顺序对List<Number>大小N进行排序的中间步骤的动画。 Number个子类实现Comparable<T>,因此compareTo()已经完成。 GridLayout(1, 0) JLabel每个Icon都可以用[0, N)来显示值。 DecRenderer显示了如何创建比例大小的图标;你想要在{{1}}的间隔内改变高度。 GrayIcons&amp; Mad的example显示了如何以某种顺序为图标的显示设置动画。

答案 1 :(得分:2)

为什么这不起作用有很多原因。首先,javax.swing.Timer不能以这种方式工作。它会在后台等待,直到给定的延迟过去,然后调用已注册的ActionListener s actionPerformed方法。

其次,如果它以这种方式工作,它将阻止事件调度线程,阻止它处理重绘请求。

我认为你会发现使用How to use Swing Timers

public class BlinkOut {

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

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

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

        });
    }

    public class TestPane extends JPanel {

        private JLabel[] labels;
        private int[] delays;
        private Timer timer;
        private int index;

        public TestPane() {
            setLayout(new GridLayout(0, 1));
            labels = new JLabel[7];
            for (int index = 0; index < 7; index++) {
                labels[index] = new JLabel("Label " + (index + 1));
                add(labels[index]);
            }
            delays = new int[] {2000, 3000, 2000, 2000, 2000, 2000, 2000};
            JButton hide = new JButton("Hide");
            add(hide);
            hide.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Click");
                    index = 0;
                    labels[index].setVisible(false);
                    timer.setDelay(delays[index]);
                    timer.start();
                }
            });
            timer = new Timer(delays[0], new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Tick");
                    timer.stop();
                    index++;
                    if (index < 7) {
                        labels[index].setVisible(false);
                        timer.setDelay(delays[index]);
                        timer.start();
                    }
                }
            });
            timer.setRepeats(false);
            timer.setCoalesce(true);
        }
    }

}