问题 1:用户可以编辑小时、分钟和秒分隔符“:”,并且可以写入额外的数字,例如“123”
您可以使用编辑器的格式化程序来完成此操作获取文本字段() http://docs.oracle.com/javase/7/docs/api/javax/swing/JSpinner.DefaultEditor.html#getTextField%28%29 method:
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 http://docs.oracle.com/javase/7/docs/api/javax/swing/JFormattedTextField.html with a 日期格式化程序 http://docs.oracle.com/javase/7/docs/api/javax/swing/text/DateFormatter.html作为格式化程序。看看如何使用格式化文本字段 http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html以便更好地了解如何使用此组件。
请注意创建编辑器时使用的模式。由于您的第二个要求,它是“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);
Example
这是一个非常简单的例子来测试我所说的内容。希望它有帮助。
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();
}
});
}
}
Edit
当用户尝试手动写入小时或分钟(不使用箭头)时,我认为会出现一些逻辑问题。示例我写了 12 但微调器显示 21。
首先抱歉我之前没有注意到这一点。发生这种令人毛骨悚然的行为是因为格式化程序的覆盖模式属性设置为false
期间的某个地方JSpinner.DateEditor
的初始化(但找不到在哪里)。此属性是true
默认情况下根据javadoc http://docs.oracle.com/javase/7/docs/api/javax/swing/text/DefaultFormatter.html#setOverwriteMode%28boolean%29。要解决这个问题,你只需要添加这一行(我还在上面编辑了我的代码):
formatter.setOverwriteMode(true);