Я пытаюсь отобразить текстовое сообщение 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
}
}
Проблема в том, что когда вы показываете диалог "Время вверх", вы создаете новый Test
кадр в качестве родителя этого диалога. Кадр не отображается, потому что setVisible
не вызывается, но с фреймом создается новый поток таймера, начиная отсчет обратного отсчета. Вместо этого вы должны использовать существующий фрейм.
Изменить эту строку
JOptionPane.showMessageDialog(new Test() "Time is up");
к этому
JOptionPane.showMessageDialog(Test.this, "Time is up");
Timer timer = new Timer(15000, listener);
timer.setRepeats(false);
timer.start();
Вы могли бы найти это самостоятельно, просто прочитав документацию api.
Просто добавьте .setRepeats()
:
Timer timer = new Timer(15000, new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
}
});
timer.setRepeats(false);
timer.start();
1000
для обратного отсчета (vrijeme.setText(String.valueOf(brojac));
) ...