Java JSpinner默认更改为年而不是天

Java JSpinner默认更改为年而不是天,java,swing,date,awt,jspinner,Java,Swing,Date,Awt,Jspinner,问题:单击dateSpin箭头时,微调器将更改年而不是天。我想将其设置为默认值,这样只会更改天数+设置为用户无法在微调器字段中输入自己的输入 import javax.swing.*; import javax.swing.event.ChangeListener; import java.awt.*; import java.util.Calendar; import java.util.Date; public class Test1 extends JFrame { public s

问题:单击
dateSpin
箭头时,微调器将更改年而不是天。我想将其设置为默认值,这样只会更改天数+设置为用户无法在微调器字段中输入自己的输入

import javax.swing.*;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.util.Calendar;
import java.util.Date;

public class Test1 extends JFrame 
{

public static void main(String[] args)
{
    Test1 frame1 = new Test1();
    frame1.setVisible(true);
}

public Test1()
{
    super("Test");
    setLayout(new FlowLayout());

    setSize(300,300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);

    JSpinner spinner = new JSpinner();
    Date date = new Date();
    spinner.setModel(new SpinnerDateModel(date, null, null, Calendar.DAY_OF_MONTH));

    JSpinner.DateEditor dateEditor = new JSpinner.DateEditor(spinner, "yyyy/MM/dd");

    spinner.setEditor(dateEditor);

    add(spinner);

   }

}
oracle文档中提到了此问题:

但是,请注意,某些类型的外观会忽略指定的字段,而更改显示为选中的字段


但是,由于我不精通Java,我不知道如何解决这个问题。

这不是一个好的解决方案,但您可以确保文本字段的插入符号位置始终位于末尾(您希望微调器不可编辑的事实可能会使此技术更容易接受):



这对我来说很有效,我使用了以下LAF:
Metal
Nimbus
Motif
Windows
Windows Classic
。(这就是我现在可以测试的所有LAF)

为了更快地获得更好的帮助,发布一个or。我刚刚制作了一个MCVE,在这两个Windows LAF和(默认)金属外观中,年份首先发生了变化,因为它是关注的数字。当箭头指向日期时,向上/向下按钮改变了日期。这样,当我将日期上传到csv文件时,我必须对其进行操作并更改日期布局。我想我可以走那条路,但我只是想也许有一个显而易见的解决办法。也许现在就把注意力集中在几天上?不,我实际上去掉了评论中关于把一天移到第一部分的那部分,因为我试过了,它显示出同时改变一天和一年的奇怪行为P你自己试试……哦。。。好的:)我相信可以通过构建自定义模型来改变,但对于这样一件小事来说,这似乎是一种麻烦的方式。
dateEditor.getTextField().setEditable(false);
dateEditor.getTextField().addCaretListener(new CaretListener() {
    @Override
    public void caretUpdate(CaretEvent e) {
        int pos = dateEditor.getTextField().getDocument().getLength();
        if (e.getDot() != pos) {
            dateEditor.getTextField().setCaretPosition(pos);
        }
    }
});