【问题标题】:HOWTO Select JSpinner date field when JSpinner gets focus如何在 JSpinner 获得焦点时选择 JSpinner 日期字段
【发布时间】:2013-05-09 20:34:25
【问题描述】:

我正在尝试让一个 JSpinner(包含一个分钟/秒计时器)为一群不关心鼠标但希望每次击键都准确无误地按自己的方式设置的人工作习惯了。它几乎可以按我的意愿工作,但最后一英里是最难的。

这在实践中意味着,当其中一个文本字段获得焦点时,微调器的外观和行为应该与用户从其中一个字段中按下箭头键后的外观和行为完全相同。

Spinner 的创建方式如下:

this.countdown = new JSpinner(this.model);
this.editor = new JSpinner.DateEditor(countdown, "m:ss");
JFormattedTextField textField = editor.getTextField();

第 1 步。当我的微调器出现时,它看起来像这样: ('|'表示插入符号,粗体表示选择)

|1:00
(未选择任何内容)

第 2 步。如果从此处按下向上箭头 它看起来像这样:

2|:00
(选择了 2 分钟字段)

第 3 步。如果从这里按下右箭头,我们会得到:

2:|00
(未选择任何内容)

第 4 步。如果从这里按下向上箭头,我们会得到

2:01|
(01 秒字段被选中)

我希望它在所有这些情况下都能像在第 2 步和第 4 步中那样工作。当其中一个子字段获得焦点时,应该选择它。

有什么办法可以做到吗?

【问题讨论】:

    标签: java swing jspinner


    【解决方案1】:

    也许你可以使用 FocusListener。

    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    
    public class SpinnerFocusTest {
      private static final String PATTERN = "m:ss";
      public JComponent makeUI() {
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(60*1000);
        Date value = c.getTime();
    
        SpinnerDateModel m = new SpinnerDateModel(
            value, null, null, Calendar.MINUTE);
    
        JSpinner sp1 = new JSpinner(m);
        sp1.setEditor(new JSpinner.DateEditor(sp1, PATTERN));
    
        JSpinner sp2 = new JSpinner(m);
        final JSpinner.DateEditor editor =
          new JSpinner.DateEditor(sp2, PATTERN);
        sp2.setEditor(editor);
        editor.getTextField().addFocusListener(new FocusAdapter() {
          @Override public void focusGained(FocusEvent e) {
            EventQueue.invokeLater(new Runnable() {
              @Override public void run() {
                JTextField f = editor.getTextField();
                int i = f.getText().lastIndexOf(":");
                f.select(i+1, i+3);
              }
            });
          }
        });
    
        JPanel p = new JPanel(new GridLayout(2,1,5,5));
        p.add(sp1);
        p.add(sp2);
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(p, BorderLayout.NORTH);
        panel.setBorder(BorderFactory.createEmptyBorder(8,8,8,8));
        return panel;
      }
      public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
          @Override public void run() {
            createAndShowGUI();
          }
        });
      }
      public static void createAndShowGUI() {
        JFrame f = new JFrame("");
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().add(new SpinnerFocusTest().makeUI());
        f.setSize(320, 240);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多