首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jSpinner时间选择器模型编辑

jSpinner时间选择器模型编辑
EN

Stack Overflow用户
提问于 2014-02-22 20:40:01
回答 2查看 14.7K关注 0票数 4

我让jSpinner用来挑选时间。问题1:用户可以编辑小时分钟和第二个分隔符":“并且可以写额外的数字,比如"123”问题2:模型总是得到当前时间。我想要"00:00:00“当我用代码写这个,而不是"hh:mm:ss”用户不能编辑这些值。

我的准则是;

代码语言:javascript
复制
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"));

任何帮助都很感激。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-22 21:15:22

问题1:用户可以编辑小时分钟和第二个分隔符":“,并可以编写类似"123”的额外数字。

您可以使用编辑器的格式化程序通过getTextField()方法完成这一任务:

代码语言:javascript
复制
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);

文本字段实际上是一个JFormattedTextFieldDateFormatter作为格式化程序。查看如何使用格式化文本字段,以更好地理解如何使用该组件。

注意创建编辑器时使用的模式。因为你的第二个要求,所以它是"HH:mm:ss“。

问题2:模型总是得到当前时间。我要“00:00”

您需要在下午12点(24小时)向您的纺纱机提供初始日期,该日期将在“00:00:00”中翻译:

代码语言:javascript
复制
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);

示例

这里有一个很简单的例子来测试我说过的话。希望能帮上忙。

代码语言:javascript
复制
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。要解决此问题,只需添加这一行(我还编辑了上面的代码):

代码语言:javascript
复制
formatter.setOverwriteMode(true);
票数 4
EN

Stack Overflow用户

发布于 2016-03-15 20:46:36

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21960236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档