Firing delay between JFrame components

后端 未结 2 1737
无人及你
无人及你 2020-12-22 00:08

I want to show how merge sort perform visually using JFrame. What I want to do is to make visible subsequent JLabel with some time delay. I tried m

2条回答
  •  猫巷女王i
    2020-12-22 00:37

    There are a number of reasons why this won't work. Firstly, javax.swing.Timer doesn't work this way. It waits in the background until the given delay has past and then calls the registered ActionListeners actionPerformed method.

    Secondly, if it did work this way, it would block the Event Dispatching Thread, preventing it from processing repaint requests.

    I think you will find How to use Swing Timers of use.

    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);
            }
        }
    
    }
    

提交回复
热议问题