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")); 

任何帮助赞赏。 谢谢。

问题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作为格式化程序。 请参阅如何使用格式化文本字段以更好地了解如何使用此组件。

请注意创建编辑器时使用的模式。 因为你的第二个要求,它是“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。

首先对不起我以前没注意过。 这种令人毛骨悚然的行为发生是因为在JSpinner.DateEditor初始化期间格式化程序的覆盖模式属性设置为false (但无法找到位置)。 默认情况下,根据javadoc,此属性为true 。 要解决这个问题,你只需要添加这一行(我上面也编辑了我的代码):

 formatter.setOverwriteMode(true); 

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

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

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

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

DateTimePicker截图 演示截图