JSpinner默认更改年份而不是天

时间:2016-07-20 15:29:56

标签: 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 docs中提到了这个问题:

  

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

但是,由于我不熟悉Java,我不明白如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

这不是一个好的解决方案,但你可以确保文本字段的插入位置始终在最后(你希望微调器不可编辑的事实可能使这种技术更容易忍受):

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 Classic。 (这就是我现在可以测试的所有LaF)