将更新的值设置为JSpinner

时间:2013-11-21 12:19:17

标签: java swing awt spinner

我已经实现了Jspinner,其中我添加了mouseClicked Listener,它将微调器设置为当前日期时间,但在成功提交后,微调器需要设置为空白,这工作正常,但是当我第二次点击微调器然后它显示旧值以及mouseClicked Listener未被调用为什么?  注意:我使用SpinnerDateModel作为微调器。

private void spinnerMouseClicked(java.awt.event.MouseEvent evt) {
     spinner.setModel(new SpinnerDateModel(new Date(), null, null, Calendar.HOUR_OF_DAY));
     SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm");
     ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().setFormatterFactory(new DefaultFormatterFactory(new DateFormatter(format)));

     ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().addCaretListener(new CaretListener() {
         @Override
         public void caretUpdate(CaretEvent e) {
             if (0 == ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().getCaretPosition()) {
                 if (((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().getText().length() > 13) {
                     ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().setCaretPosition(13);
                 }
             }
         }
     });
}  

private void submit(){
((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().setText(null);

}

1 个答案:

答案 0 :(得分:1)

在多次阅读问题后,我认为最终得到你想要完成的事情:每次用户总结信息时必须清除文本,但是当用户再次聚焦微调器时,它必须显示今天的日期。不是吗?

如果是,那么我建议您不要在MouseListener上使用JSpinner,而是将FocusListener附加到微调器的编辑器上。像这样:

SpinnerDateModel model = new SpinnerDateModel(new Date(), null, null, Calendar.DAY_OF_WEEK);
final JSpinner spinner = new JSpinner(model);
final JTextField editor = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();

editor.addFocusListener(new FocusAdapter() {
    @Override
    public void focusGained(FocusEvent e) {
        if(editor.getText().isEmpty()){
            spinner.getModel().setValue(new Date());
        }
    }
});

JButton submit = new JButton("Submit");
submit.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        editor.setText("");
    }
});

这样你就拥有了这些优势:

  • Spinner的模型只设置一次(应该是这样)。
  • 当微调器的编辑器聚焦时(通过鼠标单击或键盘导航),如果先前已清除文本,则会将新日期设置为微调器模型
  • 摆脱用于其他目的的MouseListener