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

有多种方法可以实现您想要的。

有很多问题你必须克服。第一个是,您绝不能在事件调度线程的上下文中执行任何耗时或阻塞的操作。这样做会阻止 Swing 处理重绘请求。

第二个是,您绝不能从除 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 回答