Событие «Получение фокуса» и «Потеря фокуса»

У меня есть 4 JTextfields в моей форме качания java. Проблема в том, что мне нужно переместить фокус с одного JTextField на другой через код Java, а не с помощью клавиши табуляции.

Если фокус, полученный JTextField2, означает, что необходимо выбрать содержимое в JTextField2. Я не знаю, как это сделать, пожалуйста, поместите правильный код, связанный с этой проблемой.


person sjohnfernandas    schedule 17.12.2011    source источник
comment
пожалуйста, введите правильный код Пожалуйста, укажите вашу лучшую попытку в виде SSCCE. Добавление того, что вы пробовали после прочтения Как использовать подсистему Focus и документы JTextField (со специальными внимание на любую находку на 'select') тоже не помешает. Также обратите внимание, что это не текстовое сообщение, поэтому это «пожалуйста», а не «пожалуйста».   -  person Andrew Thompson    schedule 17.12.2011
comment
@sjohnfernandas - вы действительно читаете ответы, потому что не принимаете и не отвечаете ни на один из них (на этот и другие ваши вопросы)? Если вы продолжите в том же духе, люди перестанут вам помогать...   -  person Stijn Geukens    schedule 27.12.2011


Ответы (2)


Вы можете вызвать requestFocusInWindow() для текстового поля, на которое вы хотите сфокусироваться.

person Jonas    schedule 17.12.2011

это может быть немного сложно

вы должны обернуть и отложить свое Action или ActionListener в invokeLater() и поместить внутрь (самый безопасный способ - установить следующий код линии)

  • JTextField2.setText(JTextField2.getText);

а также

  • JTextField2.selectAll();

изменить на @Эндрю Томпсон

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());
            Component c = e.getComponent();//works for editable JComboBox too
            if (c instanceof JFormattedTextField) {
                ((JFormattedTextField) c).selectAll();
            } else if (c instanceof JTextField) {
                ((JTextField) c).selectAll();
            }//both methods not correct required setText(getText()) inside invokeLater
        }

        private String name(Component c) {
            return (c == null) ? null : c.getName();
        }
    };
person mKorbel    schedule 17.12.2011
comment
JTextField2.setText(JTextField2.getText); Разве это не будет иметь никакого эффекта или войдет в бесконечный цикл? - person Andrew Thompson; 17.12.2011
comment
если вы запускаете что-либо внутри EDT или периодически обновляете другой JComponent (с прикрепленными слушателями) из фоновой задачи, то вы можете довольно сильно потерять фокус, и вам придется принудительно фокусировать эти два кода, завернутые внутри invokeLater, работайте для меня для всех TextComponent, исключая JTextPane - person mKorbel; 17.12.2011
comment
Ваше редактирование имеет смысл, но тогда оно, похоже, не связано с вызовом экземпляра текстового поля, чтобы установить его в текст .. самого себя. - person Andrew Thompson; 17.12.2011