Невозможно получить JFormattedTextField, чтобы выделить событие фокуса щелчка мыши - PullRequest
0 голосов
/ 28 апреля 2011

Я безуспешно пытался получить 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();
        }
    }
}

Я также определяю (довольно многословно!) FocusListener, который использует SwingUtilities.invokelater;

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;

Любая помощь будет принята с благодарностью!

Ответы [ 5 ]

1 голос
/ 29 апреля 2011

возможно у вас проблемы с EDT,

как метод, который вы используете для / как вы добавили значение в JTextField

работает с JTextField, JFormateddTextField, также с JComboBox и с функциями автозаполнения 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();
    }
};
1 голос
/ 28 апреля 2011

в основном вы можете использовать этот код (не уверен, что для каждого форматера и масок ввода), но для 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 ...

1 голос
/ 28 апреля 2011

Я не хочу давать простой ответ, но вы пытались использовать интерфейс MouseListener (или класс MouseAdapter)?

Вы пробовали что-то вроде этого:

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

Также яне рекомендовал бы делать это асинхронно.

1 голос
/ 28 апреля 2011

Если вы хотите специализированное поведение для щелчка мыши, то добавьте MouseAdapter в ваш JTextFiled, а в обработчике события mouseClicked явно измените фон.

1 голос
/ 28 апреля 2011

Попробуйте следующий код

 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();              
                                    }
                            });
                }
            });
...