Domanda

is there any way to automatically update a SimpleDateFormat digital clock on a JPanel?

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
time.setText(sdf.format(new Date()));

If I run this, the label stays at the time the script was launched...

UPDATE

What I wrote so far

import java.awt.*;
import java.awt.image.BufferedImage;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;

public class test {

private JFrame frame = new JFrame("Time");
private JPanel panel = new JPanel();
private JLabel time = new JLabel();
private JButton exit = new JButton("exit");
private boolean exit_bool = false;

public test() {
    panel.setLayout(new GridBagLayout());
    panel.add(time);
    panel.add(exit);
    panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.add(panel);
    frame.setLocationRelativeTo(null);
    init(true, true);
    createHandler();
    startTime();
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            test viewable = new test();
        }
    });
}

public void init(boolean fullscreen, boolean mouse) {
    frame.setVisible(false);
    frame.dispose();
    frame.setUndecorated(true);
    frame.setVisible(true);
    if(fullscreen) {
        frame.setExtendedState(frame.MAXIMIZED_BOTH); 
    }
    if(!mouse) {
        frame.setCursor(java.awt.Toolkit.getDefaultToolkit().createCustomCursor(new BufferedImage(1,1,BufferedImage.TYPE_4BYTE_ABGR),new java.awt.Point(0,0),"NOCURSOR"));
    }
}

public void startTime() {
    while(!exit_bool) {
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
    time.setText(sdf.format(new Date()));
    }
}

public void createHandler() {
    exit.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            exitActionPerformed(evt);
        }
    });
}

private void exitActionPerformed(java.awt.event.ActionEvent evt) {                                         
    exit_bool = true;
} 

}
È stato utile?

Soluzione

Something like will do the trick

package net.whatever;

import javax.swing.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Clock");
        frame.setSize(200, 100);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);

        final JLabel label = new JLabel("", SwingConstants.CENTER);
        label.setFont(label.getFont().deriveFont(25f));
        label.setSize(200, 100);
        frame.add(label);

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                String string = new SimpleDateFormat("HH:mm:ss").format(new Date());
                label.setText(string);
            }
        }, 0, 1000);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top