jSpinner时间选择器模型编辑

Bla*_*ite 4 java swing jspinner timepicker

我有 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"));
Run Code Online (Sandbox Code Playgroud)

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

dic*_*c19 5

问题 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);
Run Code Online (Sandbox Code Playgroud)

文本字段实际上是一个带有DateFormatter作为格式化程序的JFormattedTextField。请参阅如何使用格式化文本字段,以更好地了解如何使用此组件。

请注意创建编辑器时使用的模式。由于您的第二个要求,它是“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);
Run Code Online (Sandbox Code Playgroud)

例子

这是一个非常简单的例子来测试我所说的。希望它有帮助。

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();
            }
        });
    }    
}
Run Code Online (Sandbox Code Playgroud)

编辑

当用户尝试手动写入小时或分钟(不使用箭头)时,我认为会出现一些逻辑问题。示例我写了 12 但微调器显示 21。

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

formatter.setOverwriteMode(true);
Run Code Online (Sandbox Code Playgroud)