我有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"));
任何帮助表示赞赏。感谢。
答案 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。
下面粘贴了组件和演示应用程序的屏幕截图。