jSpinner时间选择器模型编辑

时间:2014-02-22 20:40:01

标签: java swing timepicker jspinner

我有jSpinner用于时间选择。 问题1:用户可以编辑小时分钟和第二个分隔符“:”并可以编写额外的数字,如“123” 问题2:模型总是获得当前时间。我想要“00:00:00”当我在代码中写这个而不是“hh:mm:ss”时,用户无法编辑这些值。

我的代码是;

spinner1 = new javax.swing.JSpinner();
SpinnerDateModel spinnermodel = new SpinnerDateModel();
spinnermodel.setCalendarField(Calendar.MINUTE);
spinner1 .setModel(spinnermodel);
spinner1 .setEditor(new JSpinner.DateEditor(spinner1 , "hh:mm:ss"));

任何帮助表示赞赏。感谢。

2 个答案:

答案 0 :(得分:3)

  

问题1:用户可以编辑小时分钟和第二个分隔符“:”和   可以写出额外的数字,如“123”

您可以使用编辑器的格式化程序通过getTextField()方法完成此操作:

JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "HH:mm:ss");
DateFormatter formatter = (DateFormatter)editor.getTextField().getFormatter();
formatter.setAllowsInvalid(false); // this makes what you want
formatter.setOverwriteMode(true);

文本字段实际上是JFormattedTextField,格式化程序为DateFormatter。请查看How to Use Formatted Text Fields,以便更好地了解如何使用此组件。

请注意创建编辑器时使用的模式。因为你的第二个要求,它是“HH:mm:ss”。

  

问题2:模型总是获得当前时间。我想要“00:00:00”

您需要在下午12点(24小时)向您的微调器提供初始日期,该日期将在“00:00:00”翻译:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 24);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);

SpinnerDateModel model = new SpinnerDateModel();
model.setValue(calendar.getTime());

JSpinner spinner = new JSpinner(model);

实施例

这是一个非常简单的例子来测试我所说的内容。希望它有所帮助。

import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
import javax.swing.SwingUtilities;
import javax.swing.text.DateFormatter;

public class Demo {

    private void createAndShowGUI() {

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 24); // 24 == 12 PM == 00:00:00
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        SpinnerDateModel model = new SpinnerDateModel();
        model.setValue(calendar.getTime());

        JSpinner spinner = new JSpinner(model);

        JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "HH:mm:ss");
        DateFormatter formatter = (DateFormatter)editor.getTextField().getFormatter();
        formatter.setAllowsInvalid(false); // this makes what you want
        formatter.setOverwriteMode(true);

        spinner.setEditor(editor);

        JPanel content = new JPanel();
        content.add(spinner);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {                
                new Demo().createAndShowGUI();
            }
        });
    }    
}

修改

  

当用户尝试手动写小时或分钟(不使用箭头)时   我认为逻辑问题一目了然。示例我写12但旋转显示   21。

首先对不起我之前没有注意到。这种令人毛骨悚然的行为发生是因为格式化程序的覆盖模式属性在false初始化期间的某处设置为JSpinner.DateEditor(但无法找到位置)。根据{{​​3}},此属性默认为true。要解决此问题,您只需添加此行(我还编辑了上面的代码):

formatter.setOverwriteMode(true);

答案 1 :(得分:2)

JSpinner类并非专门设计用作时间选择器,因此很难自定义其行为。 LGoodDatePicker库中的 TimePicker 类可能是此用法的更好选择。

您提到想要以格式显示分钟和秒数。可以使用java.time DateTimeFormatter类自定义TimePicker格式。

项目主页:https://github.com/LGoodDatePicker/LGoodDatePicker

下面粘贴了组件和演示应用程序的屏幕截图。

DateTimePicker screenshot Demo screenshot