问题 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.
首先抱歉,我之前没有注意到这一点。之所以会发生这种令人毛骨悚然的行为,是因为格式化程序的覆盖模式属性在 JSpinner.DateEditor 的初始化期间某处设置为 false(但找不到位置)。根据javadoc,该属性默认为true。要解决这个问题,您只需要添加这一行(我还编辑了上面的代码):
formatter.setOverwriteMode(true);