// Set default values for our properties
setFormat(DateFormat.getTimeInstance(DateFormat.MEDIUM, getLocale()));
setUpdateFrequency(1000); // Update once a second
// Specify a Swing TransferHandler object to do the dirty work of
// copy-and-paste and drag-and-drop for us. This one will transfer
// the value of the "time" property. Since this property is read-only
// it will allow drags but not drops.
setTransferHandler(new TransferHandler("time"));
// Since JLabel does not normally support drag-and-drop, we need an
// event handler to detect a drag and start the transfer.
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
getTransferHandler().exportAsDrag(DigitalClock.this, e,
TransferHandler.COPY);
}
});
// Before we can have a keyboard binding for a Copy command,
// the component needs to be able to accept keyboard focus.
setFocusable(true);
// Request focus when we're clicked on
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) { requestFocus(); }
});
// Use a LineBorder to indicate when we've got the keyboard focus
addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
setBorder(LineBorder.createBlackLineBorder());
}
public void focusLost(FocusEvent e) { setBorder(null); }
});
// Now bind the Ctrl-C keystroke to a "Copy" command.
InputMap im = new InputMap();
im.setParent(getInputMap(WHEN_FOCUSED));
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK),
"Copy");
setInputMap(WHEN_FOCUSED, im);
// And bind the "Copy" command to a pre-defined Action that performs
// a copy using the TransferHandler we've installed.
ActionMap am = new ActionMap();
am.setParent(getActionMap());
am.put("Copy", TransferHandler.getCopyAction());
setActionMap(am);
// Create a javax.swing.Timer object that will generate ActionEvents
// to tell us when to update the displayed time. Every updateFrequency
// milliseconds, this timer will cause the actionPerformed() method
// to be invoked. (For non-GUI applications, see java.util.Timer.)
timer = new Timer(updateFrequency, new ActionListener() {
public void actionPerformed(ActionEvent e) {
setText(getTime()); // set label to current time string
}
});
timer.setInitialDelay(0); // Do the first update immediately
timer.start(); // Start timing now!