首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSpinner:自动选择onFocus

JSpinner:自动选择onFocus
EN

Stack Overflow用户
提问于 2014-01-07 11:58:13
回答 1查看 1.2K关注 0票数 2

当用户通过表单中的JTextFields和JSpinners选项卡时,我希望实现自动选择。为此,我使用了以下侦听器:

代码语言:javascript
复制
public class AutoSelect implements FocusListener {

    @Override
    public void focusGained(final FocusEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                if (e.getSource() instanceof JTextField) {
                    try {
                        JTextField t = (JTextField) e.getComponent();
                        t.selectAll();
                    } catch (ClassCastException ex) {
                        // 
                    }
                }else if (e.getSource() instanceof JSpinner){
                    JSpinner spinner = (JSpinner)e.getComponent();
                    JTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();  
                    tf.selectAll();
                }
            }
        });
    }

    @Override
    public void focusLost(FocusEvent e) {
        // 
    }
}

只是它对我的纺纱机不起作用。事件被触发,正确的行被执行,只有什么都没有发生。我怀疑我没有正确地使用.getTextField()。有人有办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-07 12:32:03

  • tf.selectAll();应该封装在invokeLater中,Focus的所有内容都是非常异步的(更多介绍Oracle教程How to use Focus, FocusSubsystem),
  • 然后,invokeLater (并非所有情况下都适用于所有JComponents,但在默认情况下为JTextComponents )将此事件移动到队列末尾,对我非常正确。

代码语言:javascript
复制
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ComboBoxTwo extends JFrame {

    private static final long serialVersionUID = 1L;
    private JTextField text = new JTextField(15);
    private JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 15, 1));

    public ComboBoxTwo() {
        text.setText("Something selectable");
        text.addFocusListener(fcsListener);
        JFormattedTextField format = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField();
        // or JTextField tf = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField();
        format.addFocusListener(fcsListener);
        //or tf.addFocusListener(fcsListener); // depends of type for SpinnerXxxModel 
        add(text, BorderLayout.NORTH);
        add(spinner, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new ComboBoxTwo();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
//
    private FocusListener fcsListener = new FocusListener() {
        @Override
        public void focusGained(FocusEvent e) {
            dumpInfo(e);
        }

        @Override
        public void focusLost(FocusEvent e) {
            dumpInfo(e);
        }

        private void dumpInfo(FocusEvent e) {
            System.out.println("Source  : " + name(e.getComponent()));
            System.out.println("Opposite : " + name(e.getOppositeComponent()));
            System.out.println("Temporary: " + e.isTemporary());
            final Component c = e.getComponent();//works for editable JComboBox too
            if (c instanceof JFormattedTextField) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        ((JFormattedTextField) c).setText(((JFormattedTextField) c).getText());
                        ((JFormattedTextField) c).selectAll();
                    }
                });
            } else if (c instanceof JTextField) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        ((JTextField) c).setText(((JTextField) c).getText());
                        ((JTextField) c).selectAll();
                    }
                });
            }
        }

        private String name(Component c) {
            return (c == null) ? null : c.getName();
        }
    };
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20971050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档