如何在获得焦点时选择 JFormattedTextField 中的所有文本?

新手上路,请多包涵

我有一个使用 Swing 的小型 Java 桌面应用程序。有一个数据输入对话框,其中包含一些不同类型的输入字段(JTextField、JComboBox、JSpinner、JFormattedTextField)。当我通过在表单中切换或用鼠标单击它来激活 JFormattedTextFields 时,我希望它选择它当前包含的所有文本。这样,用户就可以开始输入并覆盖默认值。

我怎样才能做到这一点?我确实使用了在 JFormattedTextField 上调用 selectAll() 的 FocusListener/FocusAdapter,但它没有选择任何东西,尽管调用了 FocusAdapter 的 focusGained() 方法(请参见下面的代码示例)。

 private javax.swing.JFormattedTextField pricePerLiter;
// ...
pricePerLiter.setFormatterFactory(
    new JFormattedTextField.AbstractFormatterFactory() {
    private NumberFormatter formatter = null;
    public JFormattedTextField.AbstractFormatter
        getFormatter(JFormattedTextField jft) {
        if (formatter == null) {
            formatter = new NumberFormatter(new DecimalFormat("#0.000"));
            formatter.setValueClass(Double.class);
        }
        return formatter;
    }
});
// ...
pricePerLiter.addFocusListener(new java.awt.event.FocusAdapter() {
    public void focusGained(java.awt.event.FocusEvent evt) {
        pricePerLiter.selectAll();
    }
});

有任何想法吗?有趣的是,选择所有文本显然是 JTextField 和 JSpinner 的默认行为,至少在通过表单切换时是这样。

原文由 Robert Petermeier 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 426
2 个回答

使用 SwingUtilities.invokeLater 包装您的调用,以便在处理完所有待处理的 AWT 事件后发生:

 pricePerLiter.addFocusListener(new java.awt.event.FocusAdapter() {
    public void focusGained(java.awt.event.FocusEvent evt) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                pricePerLiter.selectAll();
            }
        });
    }
});

原文由 Eugene Ryzhikov 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了上述之外,如果您希望所有文本字段都这样做,您可以这样做:

 KeyboardFocusManager.getCurrentKeyboardFocusManager()
    .addPropertyChangeListener("permanentFocusOwner", new PropertyChangeListener()
{
    public void propertyChange(final PropertyChangeEvent e)
    {
        if (e.getNewValue() instanceof JTextField)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    JTextField textField = (JTextField)e.getNewValue();
                    textField.selectAll();
                }
            });

        }
    }
});

原文由 camickr 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题