0

私は JSpinner (分/秒のタイマーを含む) を、マウスのことは気にしないが、すべてのキーストロークで慣れ親しんだことを正確に実行したい、自分のやり方で設定する人々のために機能させようとしています。ほぼ思いどおりに動作しますが、最後の 1 マイルが最も困難です。

これが実際に意味することは、ユーザーがテキスト フィールドの 1 つから矢印キーを押した後の外観と動作とまったく同じように、テキスト フィールドの 1 つがフォーカスを取得したときに、スピナーの外観と動作を行う必要があるということです。

スピナーは次のように作成されます。

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

ステップ 1. スピナーが表示されると、次のようになります: ('|' はキャレットを示し、太字は選択を示します)

|1:00
(何も選択されていません)

step 2. ここから↑を押すとこんな感じ。

2 |:00
(2分フィールドが選択されています)

ステップ 3. ここから右矢印を押すと、次のようになります。

2:|00
(何も選択されていない)

ステップ 4. ここから上矢印を押すと、

2:01 | _
(01 in seconds フィールドが選択されています)

手順 2 と 4 のように、これらすべてのケースで機能するようにしたいと思います。サブフィールドの 1 つがフォーカスされたら、それを選択する必要があります。

これを実現する方法はありますか?

4

1 に答える 1

3

おそらく、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);
  }
}
于 2013-05-09T23:25:55.583 に答える