0

我一直在尝试让 JFormattedTextField 在鼠标单击时突出显示。在浏览字段时,我已经能够让它正常工作,但是我想在点击时突出显示所有内容。

如果我在文本字段上单击并按住约 1.5-2 秒,我只能在鼠标单击时突出显示;我不知道为什么。

我已经搜索并尝试了一些修复,包括扩展类;

class HFTextField extends JFormattedTextField
{
    HFTextField(MaskFormatter formatter)
    {
        super(formatter);
    }

    @Override
    protected void processFocusEvent(FocusEvent e)
    {
        super.processFocusEvent(e);
        if (e.getID() == FocusEvent.FOCUS_GAINED)
        {
            this.selectAll();
        }
    }
}

我还定义了一个(相当冗长!)使用 SwingUtilities.invokelater 的 FocusListener;

public static FocusListener CreateHighlightTextFieldFocusListener(final JTextField text_field)
    {
        FocusListener fl =
                new FocusAdapter()
                {
                    public void focusGained(FocusEvent evt)
                    {
                        SwingUtilities.invokeLater(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                text_field.selectAll();
                            }
                        });
                    }
                };

        return fl;
    }

这是创建格式化文本字段的函数;

public static JTextField CreateFormattedTextField(int x, int y, int width, int height,
                            Method action_method, Method changed_method, Method remove_method,
                            Method update_method, String mask_formatter, String banned_chars)
    {
        MaskFormatter formatter = null;

        try {

            formatter = new MaskFormatter(mask_formatter);

        } catch (ParseException e) {
            assert(false);
        }

        if(banned_chars != null)
            formatter.setInvalidCharacters(banned_chars);

        JTextField text_field = new HFTextField(formatter);

        text_field.setBounds(x, y, width, height);

        if(action_method != null)
        {
            text_field.addActionListener(CreateTextFieldActionListener(action_method, text_field));
        }

        text_field.getDocument().addDocumentListener(
                CreateTextFieldDocumentListener(changed_method, remove_method,
                                                update_method, text_field));

        text_field.addFocusListener(CreateHighlightTextFieldFocusListener(text_field));

        return text_field;

任何帮助将不胜感激!

4

5 回答 5

1

试试下面的代码

 yourTextField.addFocusListener(new java.awt.event.FocusAdapter() {
                public void focusGained(java.awt.event.FocusEvent evt) {
                    SwingUtilities.invokeLater( new Runnable() {
                                    @Override
                                    public void run() {
                                            yourTextField.selectAll();              
                                    }
                            });
                }
            });
于 2011-04-28T17:34:23.907 回答
1

我不想给出一个简单的答案,但是您是否尝试过使用 MouseListener 接口(或 MouseAdapter 类)?

你有没有尝试过这样的事情:

fieldName.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            JTextComponent text = (JTextComponent) e.getSource();
            text.selectAll();
        }      
    });

另外,我不建议异步执行此操作。

于 2011-04-28T17:35:18.773 回答
1

如果您想要鼠标单击的特殊行为,则将 MouseAdapter 添加到您的 JTextFiled,并在 mouseClicked 事件处理程序中,显式更改背景。

于 2011-04-28T17:36:33.340 回答
1

基本上您可以使用此代码(不确定对于每个格式化程序和输入掩码),但对于 Number、Date 和 String 您可以使用以下代码,并确保此 JFormattedTextField 不实现 AutoCompleted

    myTextField.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent e) {
            myTextField.requestFocus();
            myTextField.setText(myTextField.getText());
            myTextField.selectAll();
        }

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

确保您可以将其打包到 InvokeLate ...

于 2011-04-28T19:00:50.223 回答
1

也许你对 EDT 有问题,

您如何使用/如何为 JTextField 增加价值

适用于 JTextField、JFormateddTextField、JComboBox 以及 AutoCompleted funcionalies http://www.java2s.com/Code/Java/Swing-JFC/AutocompleteTextField.htm

   private FocusListener focsListener = 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());
        Component c = e.getComponent();
        if (c instanceof JFormattedTextField) {
            ((JFormattedTextField) c).requestFocus();
            ((JFormattedTextField) c).setText(((JFormattedTextField) c).getText());
            ((JFormattedTextField) c).selectAll();
        } else if (c instanceof JTextField) {
            ((JTextField) c).requestFocus();
            ((JTextField) c).setText(((JTextField) c).getText());
            ((JTextField) c).selectAll();
        }
    }

    private String name(Component c) {
        return (c == null) ? null : c.getName();
    }
};
于 2011-04-29T07:24:02.543 回答