【问题标题】:Setting updated value to JSpinner [closed]将更新值设置为 JSpinner [关闭]
【发布时间】:2013-11-21 21:56:08
【问题描述】:

我已经实现了 Jspinner,在其中我添加了 mouseClicked 侦听器,它将微调器设置为当前日期时间,但是在成功提交相同的微调器后,需要将微调器设置为空白,这工作正常但是当我第二次单击微调器时它显示旧值以及 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);

}

【问题讨论】:

  • 没有看到你的代码就很难说 :)
  • 没人知道,也投票关闭

标签: java swing awt spinner


【解决方案1】:

在多次阅读问题后,我想终于明白你想要完成什么:每次用户汇总信息时,必须清除文本,但当用户再次聚焦微调器时,它必须显示今天的日期。对不对?

如果是这样,那么我建议您不要在JSpinner 上使用MouseListener,而是将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

【讨论】:

  • 我已经尝试过这个东西,但是从第二次开始就不会调用 focusGained 方法。
  • 怎么样? 第二次以后是什么意思? focusGained 每次编辑器聚焦时都会被调用。它应该是别的东西。例如,在您的代码中,每次单击鼠标时都会向编辑器添加一个新的CaretListener。所以它可能不会做预期的事情。 @JavaLover
  • focusGained() 仅在该方法未被调用后才第一次调用,这很奇怪。以及我从中删除了 CaretListener ,但随后也没有调用 focusGained() 。
  • 这确实很奇怪。也许你可以分享你的新代码,我会看看。或者更好地尝试制作SSCCE 来重现此问题。 @JavaLover
猜你喜欢
  • 2011-06-13
  • 2011-02-23
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多