Как отобразить сообщение только один раз, когда таймер достигает 15 секунд

1

Я пытаюсь отобразить текстовое сообщение Time is up только один раз, когда Java Timer достигает 15 секунд, но он отображается каждые 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

    }
}
Теги:
timer

3 ответа

0
Лучший ответ

Проблема в том, что когда вы показываете диалог "Время вверх", вы создаете новый Test кадр в качестве родителя этого диалога. Кадр не отображается, потому что setVisible не вызывается, но с фреймом создается новый поток таймера, начиная отсчет обратного отсчета. Вместо этого вы должны использовать существующий фрейм.

Изменить эту строку

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

к этому

JOptionPane.showMessageDialog(Test.this, "Time is  up");
1
Timer timer = new Timer(15000, listener);
timer.setRepeats(false);
timer.start();

Вы могли бы найти это самостоятельно, просто прочитав документацию api.

  • 0
    Я думаю, что ему нужен интервал 1000 для обратного отсчета ( vrijeme.setText(String.valueOf(brojac)); ) ...
0

Просто добавьте .setRepeats():

Timer timer = new Timer(15000, new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {

    }
});
timer.setRepeats(false);
timer.start();
  • 0
    ОП нуждается в 1-секундном интервале для обратного отсчета. Кроме того, это не решает актуальную проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню