Java jSpinner时间选择器模型编辑
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21960236/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
jSpinner time picker model editing
提问by Black White
I have jSpinner using for time picking. Problem 1:User can edited hour minutes and second seperator ":" and can write extra digits like "123" Problem 2:model get always current time. I want "00:00:00" When i write this in code instead "hh:mm:ss" user can't edit the values.
我有 jSpinner 用于时间选择。 问题 1:用户可以编辑时分和第二个分隔符“:”,并且可以写额外的数字,如“123” 问题 2:模型总是获取当前时间。我想要“00:00:00” 当我用代码写这个而不是“hh:mm:ss”时,用户不能编辑这些值。
My Code is;
我的代码是;
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"));
Any help appreciated. Thanks.
任何帮助表示赞赏。谢谢。
采纳答案by dic19
Problem 1: User can edited hour minutes and second seperator ":" and can write extra digits like "123"
问题 1:用户可以编辑小时分和第二个分隔符“:”,并且可以写额外的数字,如“123”
You can use the editor's formatter to accomplish this through getTextField()method:
您可以使用编辑器的格式化程序通过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);
The text field is in fact a JFormattedTextFieldwith a DateFormatteras formatter. Take a look to How to Use Formatted Text Fieldsfor a better understanding on how to work with this component.
文本字段实际上是一个JFormattedTextField,以DateFormatter作为格式化程序。查看如何使用格式化文本字段以更好地了解如何使用此组件。
Note the pattern used when the editor is created. It's "HH:mm:ss" because of your 2nd requirement.
请注意创建编辑器时使用的模式。由于您的第二个要求,它是“HH:mm:ss”。
Problem 2: model get always current time. I want "00:00:00"
问题 2:模型总是获取当前时间。我想要“00:00:00”
You need to provide to your spinner with an initial date at 12 PM (24 hours) which will be translated in "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
例子
Here is a quite simple example to test what I've said. Hope it be helpful.
这是一个非常简单的示例来测试我所说的内容。希望它有帮助。
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
编辑
When user try manually write hours or minutes (not using arrows) some logical problem ocures i think. Example i write 12 but spinner shows 21.
当用户尝试手动写入小时或分钟(不使用箭头)时,我认为会出现一些逻辑问题。例如,我写了 12,但 Spinner 显示的是 21。
First off sorry I didn't note that before. This creepy behaviour happens because formatter's overwrite mode property is set to false
somewhere during JSpinner.DateEditor
's initialization (but couldn't find where). This property is true
by default according to javadoc. To solve this you only need to add this line (I've also edited my code above):
首先抱歉我之前没有注意到。发生这种令人毛骨悚然的行为是因为格式化程序的覆盖模式属性false
在JSpinner.DateEditor
的初始化期间设置为某处(但找不到位置)。true
根据javadoc默认情况下,此属性是。要解决这个问题,您只需要添加这一行(我还编辑了上面的代码):
formatter.setOverwriteMode(true);
回答by BlakeTNC
The JSpinner class was not specifically designed to be used as a time picker, so it can be difficult to customize its behavior. The TimePickerclass in the LGoodDatePickerlibrary could be a better alternative for this usage.
JSpinner 类并非专门用作时间选择器,因此很难自定义其行为。LGoodDatePicker库中的TimePicker类可能是这种用法的更好选择。
You mentioned wanting to display the minutes and seconds in your format. The TimePicker format can be customized using the java.time DateTimeFormatter class.
您提到要以您的格式显示分钟和秒。可以使用 java.time DateTimeFormatter 类自定义 TimePicker 格式。
Project Home page: https://github.com/LGoodDatePicker/LGoodDatePicker.
项目主页:https: //github.com/LGoodDatePicker/LGoodDatePicker。
Screenshots of the components and the demo application are pasted below.
下面粘贴了组件和演示应用程序的屏幕截图。