我正在尝试让一个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 in seconds字段)
我希望它能够在所有这些情况下工作,就像在步骤2和4中一样。当其中一个子场获得焦点时,应该选择它。
有没有办法让这种情况发生?
答案 0 :(得分: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);
}
}