【问题标题】:How to display message just one time When Timer reaches 15 sec当定时器达到 15 秒时如何只显示一次消息
【发布时间】:2014-03-17 12:14:49
【问题描述】:

我试图在 Java Timer 达到 15 秒时仅显示一次短信 Time is up,但它每 15 秒显示一次。我做错了什么?

代码:

package testovi;

import java.awt.EventQueue;

public class Test extends JFrame implements MouseListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private Timer time;
    private JLabel vrijeme = new JLabel("");
    private JLabel l1 = new JLabel("Blah1");
    private JLabel l2 = new JLabel("Blah2");
    private int brojac = 15;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Test frame = new Test();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Test() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 333);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JButton print = new JButton("New button");

        print.setBounds(24, 192, 89, 23);
        contentPane.add(print);

        JLabel lblVrijeme = new JLabel("Vrijeme:");
        lblVrijeme.setBounds(182, 196, 46, 14);
        contentPane.add(lblVrijeme);

        vrijeme.setBounds(245, 191, 26, 24);
        contentPane.add(vrijeme);

        JButton btnNewButton = new JButton("Start");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                startajBrojac();
            }
        });
        btnNewButton.setBounds(22, 226, 105, 23);
        contentPane.add(btnNewButton);

        l1.setBounds(182, 230, 89, 19);
        contentPane.add(l1);

        l2.setBounds(182, 260, 89, 19);
        contentPane.add(l2);

        JLabel lblNewLabel_1 = new JLabel("New label");
        lblNewLabel_1.setIcon(new ImageIcon(Test.class.getResource("/testovi/slike/sat.png")));
        lblNewLabel_1.setBounds(225, 173, 60, 60);
        contentPane.add(lblNewLabel_1);

        l1.addMouseListener(this);
        l2.addMouseListener(this);

        // Akciski listener za tajmer
        time = new Timer(1000, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                vrijeme.setText(String.valueOf(brojac));
                brojac--;
                if (brojac == -1) {
                    time.stop();
                    JOptionPane.showMessageDialog(new Test(), "Time is  up");
                }
            }
        });
        time.start();

    }

    private void startajBrojac() {
        brojac = 15;
        time.start();

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getSource() == l1) {

            startajBrojac();
        } else if (e.getSource() == l2) {
            startajBrojac();

        }

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }
}

【问题讨论】:

  • 提示:用英文写你的代码。我们不知道“brojac”或“vrijeme”是什么。用英文写作会更容易阅读。也尝试只发布尽可能多的代码来了解您的问题。
  • 我看到您已经问了很多问题,但您从未接受或投票支持任何答案。如果你想继续得到答案,你应该开始接受对你有帮助的答案!

标签: java timer


【解决方案1】:
Timer timer = new Timer(15000, listener);
timer.setRepeats(false);
timer.start();

您可以自己发现,只需阅读api documentation

【讨论】:

  • 我认为他需要1000 倒计时间隔(vrijeme.setText(String.valueOf(brojac));)...
【解决方案2】:

问题在于,当您显示“时间到了”对话框时,您会创建一个新的 Test 框架作为该对话框的父级。没有显示框架,因为setVisible 没有被调用,但是有了框架,一个新的计时器线程被创建,再次开始倒计时。您应该改用现有的框架。

改变这一行

JOptionPane.showMessageDialog(new Test() "Time is  up");

到这里

JOptionPane.showMessageDialog(Test.this, "Time is  up");

【讨论】:

    【解决方案3】:

    只需添加.setRepeats():

    Timer timer = new Timer(15000, new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
    
        }
    });
    timer.setRepeats(false);
    timer.start();
    

    【讨论】:

    • OP 需要 1 秒的时间间隔进行倒计时。此外,这并不能解决实际问题。
    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2011-07-05
    • 2012-07-27
    • 2013-12-26
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多