【问题标题】:Is there any good and free Date AND Time Picker available for Java Swing? [closed]有可用于 Java Swing 的好的免费日期和时间选择器吗? [关闭]
【发布时间】:2010-10-13 20:25:52
【问题描述】:

有没有可用于 Java Swing 的好的免费日期和时间选择器?

有很多可用的日期选择器,但没有日期和时间选择器。这是迄今为止我遇到的最接近的:Looking for a date AND time picker

有人吗?

【问题讨论】:

    标签: java swing datepicker datetimepicker


    【解决方案1】:

    对于时间选择器,您可以使用 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
    

    【讨论】:

    • 哇好简单好用!谢谢你太棒了!
    • 您可能还想结合使用诸如 JDatePicker:jdatepicker.org 之类的库来选择日期。
    • LGoodDatePicker 库包含一个很好的 DateTimePicker 组件。 (以及各个 DatePicker 和 TimePicker 类)。这三个组件简单易用。这是组件和演示应用程序的一些屏幕截图。 Screenshot 1Screenshot 2。项目主页位于github.com/LGoodDatePicker/LGoodDatePicker
    • JSpinners,IMO,丑陋且难以使用。如果您需要日期和时间,lbalazscs's answer 提供了一个更具视觉吸引力的选择器。
    【解决方案2】:

    您可以扩展 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);
        }
    }
    

    【讨论】:

    • 这个链接现在没有了,但是Wayback Machine 有它here
    • 我现在在这里包含了这个小宝石的完整代码 :)
    • 是否有单元格编辑器,将其放入表格单元格?
    • 如何在文本字段中显示时间部分?
    • 我得到它只是设置格式 DateTimePicker dp = new DateTimePicker(); dp.setFormats("dd-MM-yyyy HH:mm:ss");
    【解决方案3】:

    使用两者结合..这就是我所做的:

    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;
    }
    

    【讨论】:

      【解决方案4】:

      FLib-JCalendar 组件具有组合的日期和时间选择器。

      【讨论】:

        【解决方案5】:

        正如你所说的日期选择器很容易,那里有很多。

        至于时间选择器,请查看 Google 日历在创建新条目时是如何做到的。它允许您输入任何内容,同时它以 30 分钟为增量提供下拉菜单。当您更改分钟时,下拉菜单会发生变化。

        如果您需要允许用户选择秒数,那么您能做的最好的就是键入/下拉组合

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-19
          • 1970-01-01
          • 1970-01-01
          • 2010-09-10
          • 2012-10-10
          • 1970-01-01
          • 2010-11-17
          相关资源
          最近更新 更多