使JSpinner在聚焦时选择文本

我想改变JSpinner的行为,以便当您单击文本时,它会选择它。 这样可以更轻松地使用所需的值替换字段。 不幸的是,我无法使行为起作用,相反,它只是将光标插入文本而不选择已存在的内容。

我尝试通过((DefaultEditor) this.getEditor()).getTextField()向JSpinner本身和文本区域本身添加焦点侦听器,但这些似乎都没有预期的效果。 我的代码(对于JSpinner本身)如下:

 spinner.addFocusListener(new FocusAdapter(){ @Override public void focusGained(FocusEvent e) { ((DefaultEditor) ((JSpinner) e.getSource()).getEditor()).getTextField().selectAll(); } }); 

我不确定问题是什么。 如果重要,我正在运行Mac OS 10.7.5和Java 6u43。

编辑:我将一个System.out.println放在focusGained方法的开头,发现它从未被调用过。 所以看起来焦点在于JSpinner没有注册。 同样,我尝试将focusAdpater放在微调器和文本字段上(虽然不是同时)。

您遇到的大部分问题都与微调器在聚焦事件(以及其他几个状态事件)之后validation微调器内的任何值有关,这将绕过突出显示。

MacOS更糟糕。

我最终做的是启动一个等待很短时间(大约25毫秒)的Thread然后使用SwingUtilities.invokeLater来实际执行选择……

更新了一个示例

 import java.awt.Component; import java.awt.EventQueue; import java.awt.GridBagLayout; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.text.JTextComponent; public class AutoFocusSpinner { public static void main(String[] args) { new AutoFocusSpinner(); } public static final SelectOnFocusGainedHandler SHARED_INSTANCE = new SelectOnFocusGainedHandler(); public AutoFocusSpinner() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JSpinner spinner = new JSpinner(new SpinnerNumberModel(1, 0, 100, 1)); installFocusListener(spinner); JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new GridBagLayout()); frame.add(spinner); frame.add(new JButton("Here for testing")); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public void installFocusListener(JSpinner spinner) { JComponent spinnerEditor = spinner.getEditor(); if (spinnerEditor != null) { // This is me spending a few days trying to make this work and // eventually throwing a hissy fit and just grabbing all the // JTextComponent components contained within the editor.... List lstChildren = findAllChildren(spinner, JTextComponent.class); if (lstChildren != null && lstChildren.size() > 0) { JTextComponent editor = lstChildren.get(0); editor.addFocusListener(SHARED_INSTANCE); } } } public static  List findAllChildren(JComponent component, Class clazz) { List lstChildren = new ArrayList(5); for (Component comp : component.getComponents()) { if (clazz.isInstance(comp)) { lstChildren.add((T) comp); } else if (comp instanceof JComponent) { lstChildren.addAll(findAllChildren((JComponent) comp, clazz)); } } return Collections.unmodifiableList(lstChildren); } public static class SelectOnFocusGainedHandler extends FocusAdapter { @Override public void focusGained(FocusEvent e) { Component comp = e.getComponent(); if (comp instanceof JTextComponent) { final JTextComponent textComponent = (JTextComponent) comp; new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(25); } catch (InterruptedException ex) { } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { textComponent.selectAll(); } }); } }).start(); } } } } 

现在,就在现在,我正在祈祷一些非常好,简单,无证的财产,我们可以设置这意味着我们不需要做所有这些:P

不知道Mac,但我在Windows上使用过这段代码:

 JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor)spinner.getEditor(); JTextField textField = editor.getTextField(); textField.addFocusListener( new FocusAdapter() { public void focusGained(final FocusEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JTextField tf = (JTextField)e.getSource(); tf.selectAll(); } }); } }); 

我还使用此代码在JFormattedTextField上选择文本。