1

私はこの簡単なコードを作りました:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Nice extends JFrame implements ActionListener{
  JLabel n1 = new JLabel("1");
  JLabel n2 = new JLabel("2");
  JLabel n3 = new JLabel("3");
  JLabel n4 = new JLabel("4");
  JLabel n5 = new JLabel("5");
  JButton show = new JButton("Show The Numbers");

{
    n1.setVisible(false);
    n2.setVisible(false);
    n3.setVisible(false);
    n4.setVisible(false);
    n5.setVisible(false);
}

public Nice(){
super("Timer");
setVisible(true);
setSize(200, 200);
setLayout(new GridLayout(3,3));
add(n1);
add(n2);         
add(n3);
add(n4);
add(n5);
add(show);
show.addActionListener(this);
   }

public void actionPerformed(ActionEvent a){
  Object clicked = a.getSource();
  if (show == clicked)
  {
n1.setVisible(true);
n2.setVisible(true);
n3.setVisible(true);
n4.setVisible(true);
n5.setVisible(true);
}
}
}

そしてそれを読むためのクラス

public class NiceOpener{
  public static void main(String[] args){
    Nice frame = new Nice();
    frame.setVisible(true);
  }
}

ただし、私がやりたかったのは、表示ボタンをクリックした後、すべての数字を一度に表示するのではなく、別の数字を表示する前に 2 秒間カウントすることでした。Show Me をクリックすると 1 が表示され、2 秒後に 2 が表示され、3 秒後に 3 が表示されます。ラベルの表示設定を遅らせる最も簡単な方法は何でしょうか?

4

3 に答える 3

1
    public void actionPerformed(ActionEvent a) {
    Object clicked = a.getSource();
    if (show == clicked) {
        new ShowTask().start();
    }
}

class ShowTask extends Thread {
    @Override
    public void run() {
        int i = 2;
        n1.setVisible(true);
        try {
            Thread.sleep((i++) * 1000);
            n2.setVisible(true);
            Thread.sleep((i++) * 1000);
            n3.setVisible(true);
            Thread.sleep((i++) * 1000);
            n4.setVisible(true);
            Thread.sleep((i++) * 1000);
            n5.setVisible(true);
        } catch (InterruptedException e) {
        }

    }
}
于 2013-03-16T09:20:51.013 に答える
1

使用できますjavax.swing.Timer
アップデート

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class Nice extends JFrame implements ActionListener{
  JLabel n1 = new JLabel("1");
  JLabel n2 = new JLabel("2");
  JLabel n3 = new JLabel("3");
  JLabel n4 = new JLabel("4");
  JLabel n5 = new JLabel("5");
  JButton show = new JButton("Show The Numbers");
  int counter = 1 ;
  boolean started = false;
  javax.swing.Timer timer ;
{
    n1.setVisible(false);
    n2.setVisible(false);
    n3.setVisible(false);
    n4.setVisible(false);
    n5.setVisible(false);
}

public Nice(){
super("Timer");
timer = new javax.swing.Timer(2000,new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent evt)
        {
            hideAllLabels();
            if (counter == 1)
            {
                n1.setVisible(true);
                counter++;
            }
            else if (counter == 2)
            {
                n4.setVisible(true);
                counter++;
            }
            else if (counter == 3)
            {
                n2.setVisible(true);
                counter++;
            }
            else if (counter == 4)
            {
                n5.setVisible(true);
                counter++;
            }
            else if (counter == 5)
            {
                n3.setVisible(true);
                counter++;
                timer.stop();
            }
        }
    });
timer.setInitialDelay(0);
timer.setDelay(2000);
timer.setRepeats(true);
setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 200);
setLayout(new GridLayout(3,3));
add(n1);
add(n2);         
add(n3);
add(n4);
add(n5);
add(show);
show.addActionListener(this);
}
private void hideAllLabels()
{
    n1.setVisible(false);
    n2.setVisible(false);
    n3.setVisible(false);
    n4.setVisible(false);
    n5.setVisible(false);
}
public void actionPerformed(ActionEvent a){
  Object clicked = a.getSource();
  if (show == clicked)
  {    
      if (!timer.isRunning())
      {
          if (!started)
          {
            timer.start();
            started = true;
          }
          else
          {
              counter = 1;
              timer.restart();
          }

      }
  }
}
}
public class NiceOpener{
  public static void main(String[] args){
    Nice frame = new Nice();
    frame.setVisible(true);
  }
}
于 2013-03-16T09:26:13.563 に答える
1

あなたが望むものを達成する方法はたくさんあります。

克服しなければならない問題は数多くあります。1 つ目は、イベント ディスパッチ スレッドのコンテキスト内で、時間のかかるアクションやブロックするアクションを実行してはならないということです。そうすることで、とりわけ、Swing が再描画要求を処理できなくなります。

2 つ目は、EDT 以外のスレッドから UI コンポーネントを作成または変更してはならないということです。

最も簡単な方法は、javax.swing.Timer. 別の手段は、 を使用することSwingWorkerです。

次の例は、疑似ランダム順序を定義する方法を示しています。

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestLabelDelay extends JFrame implements ActionListener {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                TestLabelDelay frame = new TestLabelDelay();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    private List<JLabel> labels;

    public TestLabelDelay() {
        super("Timer");
        setLayout(new GridLayout(3, 3));

        labels = new ArrayList<>(25);
        for (int index = 0; index < 5; index++) {
            labels.add(createLabel(index));
        }

        add(labels.get(0));
        add(labels.get(1));
        add(labels.get(2));
        add(labels.get(3));
        add(labels.get(4));

        JButton show = new JButton("Show");
        add(show);
        show.addActionListener(this);
    }

    protected JLabel createLabel(int index) {
        JLabel label = new JLabel(String.valueOf(index));
        label.setVisible(false);
        return label;
    }

    public void actionPerformed(ActionEvent a) {
        List<Integer> order = new ArrayList<>(5);
        order.add(2);
        order.add(4);
        order.add(0);
        order.add(3);
        order.add(1);

        new ShowWorker(labels, order).execute();
    }

    public class ShowWorker extends SwingWorker<Void, Integer> {

        private List<JLabel> labels;
        private List<Integer> order;

        private ShowWorker(List<JLabel> labels, List<Integer> order) {
            this.labels = labels;
            this.order = order;
        }

        @Override
        protected void process(List<Integer> chunks) {
            for (Integer index : chunks) {
                JLabel label = labels.get(order.get(index));
                label.setVisible(true);
                label.repaint();
            }
        }

        @Override
        protected Void doInBackground() throws Exception {
            for (int index = 0; index < labels.size(); index++) {
                Thread.sleep(500);
                publish(index);
            }
            return null;
        }

    }

}
于 2013-03-16T10:56:17.400 に答える