问题:单击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,我不明白如何解决这个问题。
答案 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:Metal
,Nimbus
,Motif
,Windows
,Windows Classic
。 (这就是我现在可以测试的所有LaF)