Есть ли хороший и бесплатный инструмент выбора даты и времени для Java Swing?

Есть ли хороший и бесплатный инструмент выбора даты и времени для Java Swing?

Доступно множество средств выбора даты, но нет средства выбора даты и времени. Это самое близкое, с чем я столкнулся до сих пор: Поиск средства выбора даты И времени

Кто-нибудь?


person Community    schedule 17.03.2009    source источник


Ответы (5)


Для выбора времени вы можете использовать JSpinner и установить JSpinner.DateEditor, который показывает только значение времени.

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
person Mark    schedule 20.03.2009
comment
вау как просто и хорошо! Спасибо вы супер! - person JavaNullPointer; 08.02.2013
comment
Вы также можете использовать библиотеку, например JDatePicker: jdatepicker.org в сочетании с выбором даты. - person juanheyns; 28.01.2015
comment
Библиотека LGoodDatePicker включает хороший компонент DateTimePicker. (А также отдельные классы DatePicker и TimePicker). Три компонента просты и удобны в использовании. Вот несколько скриншотов компонентов и демо-приложения. Снимок экрана 1, Снимок экрана 2. Домашняя страница проекта находится по адресу github.com/LGoodDatePicker/LGoodDatePicker . - person BlakeTNC; 15.03.2016
comment
JSpinners, IMO, уродливы и с ними трудно работать. ответ lbalazscs дает гораздо более визуально привлекательный выбор, если вам нужны дата и время. - person Agi Hammerthief; 31.08.2018

Вы можете расширить компонент swingx JXDatePicker:

«JXDatePicker обрабатывает только даты без времени. Довольно часто нам нужно позволить пользователю выбирать дату и время. Это пример того, как использовать JXDatePicker для одновременной обработки даты и времени».

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

РЕДАКТИРОВАТЬ: Эта статья исчезла из Интернета, но, как обнаружил SingleShot, она все еще доступна в интернет-архиве. Чтобы быть уверенным, вот полный рабочий пример:

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(String[] 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);
    }
}
person lbalazscs    schedule 30.05.2012
comment
Этой ссылки больше нет, однако Wayback Machine она есть здесь. - person SingleShot; 17.01.2013
comment
Я включил здесь полный код этой маленькой жемчужины :) - person lbalazscs; 17.01.2013
comment
Есть ли редактор ячеек, чтобы поместить его в ячейку таблицы? - person whatswrong; 25.04.2014
comment
Как я могу показать часть времени в самом текстовом поле? - person Avatar Girase; 04.01.2020
comment
Я просто установил формат DateTimePicker dp = new DateTimePicker(); dp.setFormats (дд-мм-гггг ЧЧ: мм: сс); - person Avatar Girase; 04.01.2020

Используйте оба вместе.. вот что я сделал:

public static JPanel buildDatePanel(String 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;
}
person Community    schedule 04.09.2009

Существует компонент FLib-JCalendar с комбинированным средством выбора даты и времени.

person bobndrew    schedule 25.08.2010

Как вы сказали, выбор даты прост, их много.

Что касается средства выбора времени, посмотрите, как это делает Календарь Google при создании новой записи. Он позволяет вам вводить что угодно, в то же время он имеет раскрывающийся список с шагом 30 минут. Выпадающий список меняется, когда вы меняете минуты.

Если вам нужно разрешить пользователю выбирать секунды, то лучшее, что вы можете сделать, это комбинация типизируемых/выпадающих списков.

person Pyrolistical    schedule 17.03.2009