java - 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 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文档中提到了这个问题:

Note, however, that some types of look and feel ignore the specified field, and instead change the field that appears selected.

但是,由于我对 Java 不太流利,所以我不知道如何解决这个问题。

最佳答案

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

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);
        }
    }
});
<小时/>

这对我使用以下 LaF 有效:MetalNimbusMotifWindowsWindows 经典。 (这就是我现在可以测试的所有 LaF)

关于java - JSpinner 默认更改年而不是天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38484729/

相关文章:

java - 使用 CharToArray 和 foreach 以便根据用户选择增加或减少字母

Python 日期格式?

java - 无法初始化类 android.databinding.parser.XMLLexer

Java:创建大量新对象

Java : JFrame Issue with Print Statement

java - 固定位置的 JFrame 布局

java - 来自ZonedDateTime UTC实例的Java日期和时间戳

java - ISO 8601 日期格式字符串到 Java 中的 Date 对象

java - 删除空格后电子邮件地址中存在非法字符

java - 在一个 JOptionPane 消息框中转换一堆 System.out.prints