JSpinner 默认更改年而不是天
JSpinner default changes years instead of days
问题:单击 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 有效:Metal
、Nimbus
、Motif
、Windows
、Windows Classic
。 (这就是我现在可以测试的所有 LaF)
问题:单击 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 有效:Metal
、Nimbus
、Motif
、Windows
、Windows Classic
。 (这就是我现在可以测试的所有 LaF)