Java 当JSpinner获得焦点时如何选择JSpinner日期字段

Java 当JSpinner获得焦点时如何选择JSpinner日期字段,java,swing,jspinner,Java,Swing,Jspinner,我试图让一个JSpinner(包含一分钟/秒计时器)以他们的方式为一群人工作,这些人不关心鼠标,但希望每次击键都能完全按照他们习惯的方式进行。它几乎像我希望的那样工作,但最后一英里是最难的 这在实践中意味着,当微调器的一个文本字段获得焦点时,微调器的外观和行为应与用户按下其中一个字段的箭头键后的外观和行为完全相同 微调器的创建如下所示: this.countdown = new JSpinner(this.model); this.editor = new JSpinner.DateEditor

我试图让一个JSpinner(包含一分钟/秒计时器)以他们的方式为一群人工作,这些人不关心鼠标,但希望每次击键都能完全按照他们习惯的方式进行。它几乎像我希望的那样工作,但最后一英里是最难的

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

微调器的创建如下所示:

this.countdown = new JSpinner(this.model);
this.editor = new JSpinner.DateEditor(countdown, "m:ss");
JFormattedTextField textField = editor.getTextField();
第一步。当我的旋转器出现时,它看起来像这样: (“|”表示插入符号,粗体表示选择)

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

第二步。如果从此处按下向上箭头 看起来是这样的:

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

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

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

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

2:01|
(选择了01英寸秒字段)

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


有什么办法可以做到这一点吗?

也许你可以使用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);
  }
}

也许你可以使用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);
  }
}