我让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"));任何帮助都很感激。谢谢。
发布于 2014-02-22 21:15:22
问题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”
您需要在下午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初始化期间设置为true (但无法找到位置)。根据javadoc,默认情况下,此属性为true。要解决此问题,只需添加这一行(我还编辑了上面的代码):
formatter.setOverwriteMode(true);发布于 2016-03-15 20:46:36
JSpinner类不是专门设计用来作为时间选择器的,因此很难自定义它的行为。对于这种用法,TimePicker类在LGoodDatePicker库中可能是更好的替代方法。
您提到希望以您的格式显示分钟和秒。TimePicker格式可以使用java.time DateTimeFormatter类进行自定义。
项目主页:https://github.com/LGoodDatePicker/LGoodDatePicker。
下面是组件和演示应用程序的屏幕截图。


https://stackoverflow.com/questions/21960236
复制相似问题