1

を使用して、マージソートがどのように視覚的に実行されるかを示したいと思います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();

しかし、ボタンをクリックすると、遅延を維持しているにもかかわらず、すべてのラベルが同じモメネットに表示されます。

4

2 に答える 2

3

ここに示すように、タイマーのアクションリスナーのアイコンを更新する必要があります。Icon次に示すように、要素の比較値に比例したサイズのアイコンをレンダリングするためのインターフェイスを実装できます

補遺:少し具体的に教えていただけますか?

List<Number>サイズのaをN最初はランダムな順序で並べ替える中間ステップをアニメーション化する必要があります。Numberサブクラスは実装されているComparable<T>ので、compareTo()すでに実行されています。それぞれのAGridLayout(1, 0)は、値を表示するために使用できます。比例したサイズのアイコンを作成する方法を示します。間隔全体で高さを変更する必要があります。&Madのは、アイコンの表示をある順序でアニメーション化する方法を示しています。JLabelIconDecRenderer[0, N)GrayIcons

于 2013-01-21T04:39:02.820 に答える
2

これが機能しない理由はいくつかあります。まず、javax.swing.Timerこのようには機能しません。指定された遅延が経過するまでバックグラウンドで待機し、登録されたActionListenersactionPerformedメソッドを呼び出します。

次に、このように機能すると、イベントディスパッチスレッドがブロックされ、再描画要求を処理できなくなります。

スイングタイマーの使い方がわかると思います。

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

}
于 2013-01-21T10:23:07.220 に答える