jSpinner时间选择器模型编辑 [英] jSpinner time picker model editing

查看:31
本文介绍了jSpinner时间选择器模型编辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 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"));

任何帮助表示赞赏.谢谢.

解决方案

问题1:用户可以编辑小时分和第二个分隔符:"和可以写额外的数字,如123"

您可以使用编辑器的格式化程序通过 getTextField() 方法:

JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "HH:mm:ss");DateFormatter 格式化程序 = (DateFormatter)editor.getTextField().getFormatter();formatter.setAllowsInvalid(false);//这就是你想要的formatter.setOverwriteMode(true);

文本字段实际上是一个 JFormattedTextField 使用 DateFormatter 作为格式化程序.查看如何使用格式化文本字段以获得更好的效果了解如何使用此组件.

注意创建编辑器时使用的模式.由于您的第二个要求,它是HH:mm:ss".

<块引用>

问题 2:模型总是获取当前时间.我想要00:00:00"

您需要在中午 12 点(24 小时)向您的微调器提供初始日期,该日期将被翻译为00:00:00":

Calendar calendar = Calendar.getInstance();日历.设置(日历.HOUR_OF_DAY,24);日历.设置(日历.MINUTE,0);日历.设置(日历.SECOND,0);SpinnerDateModel 模型 = 新 SpinnerDateModel();模型.setValue(calendar.getTime());JSpinner spinner = new JSpinner(model);

<小时>

示例

这是一个非常简单的示例来测试我所说的内容.希望能帮到你.

import java.util.Calendar;导入 javax.swing.JFrame;导入 javax.swing.JPanel;导入 javax.swing.JSpinner;导入 javax.swing.SpinnerDateModel;导入 javax.swing.SwingUtilities;导入 javax.swing.text.DateFormatter;公开课演示{私有无效 createAndShowGUI() {日历日历 = Calendar.getInstance();日历.设置(日历.HOUR_OF_DAY,24);//24 == 12 PM == 00:00:00日历.设置(日历.MINUTE,0);日历.设置(日历.SECOND,0);SpinnerDateModel 模型 = 新 SpinnerDateModel();模型.setValue(calendar.getTime());JSpinner spinner = new JSpinner(model);JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "HH:mm:ss");DateFormatter 格式化程序 = (DateFormatter)editor.getTextField().getFormatter();formatter.setAllowsInvalid(false);//这就是你想要的formatter.setOverwriteMode(true);spinner.setEditor(editor);JPanel 内容 = 新 JPanel();内容.添加(微调器);JFrame frame = new JFrame("Demo");frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.getContentPane().add(content);框架.pack();frame.setLocationRelativeTo(null);frame.setVisible(true);}公共静态无效主(字符串 [] args){SwingUtilities.invokeLater(new Runnable() {@覆盖公共无效运行(){新演示().createAndShowGUI();}});}}

<小时>

编辑

<块引用>

当用户尝试手动写入小时或分钟(不使用箭头)时我认为是逻辑问题.示例我写了 12 但 Spinner 显示21.

首先抱歉我之前没有注意到.发生这种令人毛骨悚然的行为是因为格式化程序的覆盖模式属性在 JSpinner.DateEditor 初始化期间的某处设置为 false(但找不到位置).根据 javadoc.要解决这个问题,您只需要添加这一行(我也编辑了上面的代码):

formatter.setOverwriteMode(true);

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.

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.

解决方案

Problem 1: User can edited hour minutes and second seperator ":" and can write extra digits like "123"

You can use the editor's formatter to accomplish this through getTextField() 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);

The text field is in fact a JFormattedTextField with a DateFormatter as formatter. Take a look to How to Use Formatted Text Fields for a better understanding on how to work with this component.

Note the pattern used when the editor is created. It's "HH:mm:ss" because of your 2nd requirement.

Problem 2: model get always current time. I want "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":

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.

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):

formatter.setOverwriteMode(true);

这篇关于jSpinner时间选择器模型编辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆