Existe-t-il un sélecteur de date et d’heure gratuit et bon pour Java Swing?

Existe-t-il un sélecteur de date et d’heure gratuit et bon pour Java Swing?

Il existe un grand nombre de sélecteurs de date disponibles, mais aucun sélecteur de date et d’heure. C’est le plus proche que j’ai rencontré jusqu’à présent: À la recherche d’un sélecteur de date et heure

N’importe qui?

Pour un sélecteur de temps, vous pouvez utiliser un JSpinner et définir un JSpinner.DateEditor qui affiche uniquement la valeur de temps.

JSpinner timeSpinner = new JSpinner( new SpinnerDateModel() ); JSpinner.DateEditor timeEditor = new JSpinner.DateEditor(timeSpinner, "HH:mm:ss"); timeSpinner.setEditor(timeEditor); timeSpinner.setValue(new Date()); // will only show the current time 

Vous pouvez étendre le composant swingx JXDatePicker:

“JXDatePicker ne gère que les dates sans heure. Bien souvent, nous devons laisser l’utilisateur choisir une date et une heure. Voici un exemple de la façon d’utiliser JXDatePicker pour gérer la date et l’heure ensemble.”

http://wiki.java.net/twiki/bin/view/Javadesktop/JXDateTimePicker

EDIT: Cet article a disparu du Web, mais comme SingleShot l’a découvert, il est toujours disponible dans une archive Internet. Pour être sûr, voici l’exemple de travail complet:

 import org.jdesktop.swingx.calendar.SingleDaySelectionModel; import org.jdesktop.swingx.JXDatePicker; import javax.swing.*; import javax.swing.text.DefaultFormatterFactory; import javax.swing.text.DateFormatter; import java.text.DateFormat; import java.text.ParseException; import java.util.*; import java.awt.*; /** * This is licensed under LGPL. License can be found here: http://www.gnu.org/licenses/lgpl-3.0.txt * * This is provided as is. If you have questions please direct them to charlie.hubbard at gmail dot you know what. */ public class DateTimePicker extends JXDatePicker { private JSpinner timeSpinner; private JPanel timePanel; private DateFormat timeFormat; public DateTimePicker() { super(); getMonthView().setSelectionModel(new SingleDaySelectionModel()); } public DateTimePicker( Date d ) { this(); setDate(d); } public void commitEdit() throws ParseException { commitTime(); super.commitEdit(); } public void cancelEdit() { super.cancelEdit(); setTimeSpinners(); } @Override public JPanel getLinkPanel() { super.getLinkPanel(); if( timePanel == null ) { timePanel = createTimePanel(); } setTimeSpinners(); return timePanel; } private JPanel createTimePanel() { JPanel newPanel = new JPanel(); newPanel.setLayout(new FlowLayout()); //newPanel.add(panelOriginal); SpinnerDateModel dateModel = new SpinnerDateModel(); timeSpinner = new JSpinner(dateModel); if( timeFormat == null ) timeFormat = DateFormat.getTimeInstance( DateFormat.SHORT ); updateTextFieldFormat(); newPanel.add(new JLabel( "Time:" ) ); newPanel.add(timeSpinner); newPanel.setBackground(Color.WHITE); return newPanel; } private void updateTextFieldFormat() { if( timeSpinner == null ) return; JFormattedTextField tf = ((JSpinner.DefaultEditor) timeSpinner.getEditor()).getTextField(); DefaultFormatterFactory factory = (DefaultFormatterFactory) tf.getFormatterFactory(); DateFormatter formatter = (DateFormatter) factory.getDefaultFormatter(); // Change the date format to only show the hours formatter.setFormat( timeFormat ); } private void commitTime() { Date date = getDate(); if (date != null) { Date time = (Date) timeSpinner.getValue(); GregorianCalendar timeCalendar = new GregorianCalendar(); timeCalendar.setTime( time ); GregorianCalendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, timeCalendar.get( Calendar.HOUR_OF_DAY ) ); calendar.set(Calendar.MINUTE, timeCalendar.get( Calendar.MINUTE ) ); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date newDate = calendar.getTime(); setDate(newDate); } } private void setTimeSpinners() { Date date = getDate(); if (date != null) { timeSpinner.setValue( date ); } } public DateFormat getTimeFormat() { return timeFormat; } public void setTimeFormat(DateFormat timeFormat) { this.timeFormat = timeFormat; updateTextFieldFormat(); } public static void main(Ssortingng[] args) { Date date = new Date(); JFrame frame = new JFrame(); frame.setTitle("Date Time Picker"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DateTimePicker dateTimePicker = new DateTimePicker(); dateTimePicker.setFormats( DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.MEDIUM ) ); dateTimePicker.setTimeFormat( DateFormat.getTimeInstance( DateFormat.MEDIUM ) ); dateTimePicker.setDate(date); frame.getContentPane().add(dateTimePicker); frame.pack(); frame.setVisible(true); } } 

Utilisez les deux combinés .. c’est ce que j’ai fait:

 public static JPanel buildDatePanel(Ssortingng label, Date value) { JPanel datePanel = new JPanel(); JDateChooser dateChooser = new JDateChooser(); if (value != null) { dateChooser.setDate(value); } for (Component comp : dateChooser.getComponents()) { if (comp instanceof JTextField) { ((JTextField) comp).setColumns(50); ((JTextField) comp).setEditable(false); } } datePanel.add(dateChooser); SpinnerModel model = new SpinnerDateModel(); JSpinner timeSpinner = new JSpinner(model); JComponent editor = new JSpinner.DateEditor(timeSpinner, "HH:mm:ss"); timeSpinner.setEditor(editor); if(value != null) { timeSpinner.setValue(value); } datePanel.add(timeSpinner); return datePanel; } 

Il y a le composant FLib-JCalendar avec un sélecteur de date et d’heure combiné.

Comme vous l’avez dit, le sélecteur de dates est facile, il y en a beaucoup.

Comme pour un sélecteur de temps, vérifiez comment Google Agenda le fait lors de la création d’une nouvelle entrée. Il vous permet de taper tout en même temps il a une liste déroulante par pas de 30 minutes. Le menu déroulant change lorsque vous modifiez les minutes.

Si vous avez besoin de permettre à l’utilisateur de choisir des secondes, alors le mieux que vous puissiez faire est un combo déroulant / typable

Le meilleur des meilleurs, JCalendar: http://www.toedter.com/en/jcalendar/index.html sous licence LGPL.