【问题标题】:jSpinner time picker model editingjSpinner 时间选择器模型编辑
【发布时间】:2014-02-22 20:40:01
【问题描述】:

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

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

【问题讨论】:

  • 你能解释一下为什么第一个问题是个问题吗?第二个问题可以通过使用类似Calendar 并将小时、分钟和秒字段设置为0 并将微调器值设置为Calendar#getTime 返回的结果Date 来解决
  • 问题 1 问题,因为;如果用户删除“:”中的 1 个,微调器显示 00:00:00,我无法从用户那里获得真正的格式。这必须是一个时间选择器。用户仅与小时分钟和秒进行交互,并且不删除任何字符或添加新字符。
  • 看看this,这是我一直在修改的时间字段
  • @MadProgrammer 感谢您的参考。我调查它但真的很痛苦:) 你的代码非常专业。
  • 我们在微调器和用户能力要求方面存在很多问题,创建需求字段/组件更简单。它仍然需要一些调整,但基本的想法/意图就在那里

标签: java swing timepicker jspinner


【解决方案1】:

问题 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.

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

formatter.setOverwriteMode(true);

【讨论】:

  • 非常感谢您的演示。当用户尝试手动写入小时或分钟(不使用箭头)时,我认为会出现一些逻辑问题。示例我写了 12,但微调器显示 21。并且任何方式都不会对小时的分钟变化做出反应?
  • @BlackWhite 请查看我的编辑。希望这次能奏效(至少对我有用)。我认为它也解决了这个问题:“还有什么方法不会将分钟更改为小时?”
  • 是的,这是工作。 59 到 0 小时后静止分钟变化增加 1 次,也秒到分钟。反正问题不大。感谢您的解决方案。
【解决方案2】:

JSpinner 类并不是专门为用作时间选择器而设计的,因此很难自定义其行为。 LGoodDatePicker 库中的 TimePicker 类可能是这种用法的更好替代方案。

您提到希望以您的格式显示分钟和秒。可以使用 java.time DateTimeFormatter 类自定义 TimePicker 格式。

项目主页:https://github.com/LGoodDatePicker/LGoodDatePicker.

组件和演示应用程序的屏幕截图粘贴在下面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2011-03-13
    • 2012-04-27
    相关资源
    最近更新 更多