Есть ли версия postActionEvent для KeyEvent (в частности, для JTextArea)?

Я пишу программу, которая содержит несколько JTextFields и 2 JTextAreas на панели ввода. У меня есть кнопка отправки внизу. Я настроил его так, что когда пользователь вводит что-то в каждое поле (включая JTextAreas) и нажимает клавишу Enter, он обновляет текстовый файл, а когда они нажимают кнопку отправки, он обновляет файл, а затем выводит его новую версию в локальный каталог.

Если пользователь нажимает Enter в любом из полей, он подтверждает их ввод, однако я хочу повторно проверить все поля, когда они нажимают кнопку отправки. Каждое поле (опять же, включая JTextAreas) имеет свою собственную проверку проверки в своем ActionListener или KeyListener (для JTextAreas). Достаточно просто использовать postActionEvent() для JTextFields, но есть ли аналогичный метод для JTextAreas, чтобы вызвать KeyEvent? Я не хочу дублировать код и потреблять память, переписывая проверка этих двух компонентов внутри ActionEvent для JButton.

К сожалению, я не могу предоставить образец, потому что пишу программу на секретной машине (ПК).


person Brian Pelc    schedule 26.10.2012    source источник


Ответы (2)


Вы можете имитировать нажатие ENTER с помощью Robot методы класса keyPress(..) и keyRelease(..). Вам, конечно, придется перебрать все JTextAreas в компоненте и вызвать requestFocusInWindow(..), а затем симулировать нажатие клавиши (обработка Exception опущена):

Robot robot = new Robot();//throws AWTException

...

Component[] components=getContentPane().getComponents();  

for(int i=0;i<components.length;i++)  
{
    if(components[i] instanceof JTextArea) { 
         components[i].requestFocusInWindow();
         simulateEnter();
     }
}

public static void simulateEnter() {
     robot.keyPress(KeyEvent.VK_ENTER);
     robot.keyRelease(KeyEvent.VK_ENTER);
}
person David Kroukamp    schedule 26.10.2012
comment
+1 еще раз за информацию, но еще раз внимательно посмотрите, что Java Docs говорит о методе requestFocus() в этом ссылка. В пользу requestFocusInWindow() Поведение фокуса этого метода может быть реализовано единообразно на разных платформах, поэтому разработчикам настоятельно рекомендуется по возможности использовать этот метод вместо requestFocus. Код, использующий requestFocus, может вести себя по-разному на разных платформах - person nIcE cOw; 27.10.2012
comment
@GagandeepBali +1 спасибо за очень полезную информацию. Редактирование было сделано - person David Kroukamp; 27.10.2012
comment
Спасибо, что указали мне на класс роботов. Это поможет выпустить работающую версию моего продукта. Спасибо, что нашли время, чтобы помочь мне! - person Brian Pelc; 27.10.2012

Зачем пытаться опубликовать KeyEvent для запуска проверки, когда вы можете просто вызвать свой метод validate, например в псевдокоде

myTextArea.getDocument().addDocumentListener(){
  //in each of the method you call validate

}

private function validate( ){
  //do your validation
}

private function submitButtonFunction(){
  validate();
}

Также обратите внимание, что рекомендуется использовать DocumentListener, если вы хотите реагировать на ввод в JTextComponent. Например, ваш KeyListener не будет запущен после перетаскивания. В зависимости от реализации вашего KeyListener он также может дать сбой при использовании копирования-вставки.

person Robin    schedule 26.10.2012
comment
Спасибо за внимание к DocumentListener, копирование-вставка — большая часть того, что они вводят в JTextArea. Но я недостаточно ясно выразился, и это моя вина. Метода проверки нет, только встроенный код для проверки каждого поля в их собственном EventListener. Каждое поле требует слишком разных критериев для коллективной проверки или имеет общий метод проверки. Вот почему мне нужно запустить KeyEvent (или DocumentListener, если я пойду по этому пути). Спасибо, что нашли время, чтобы помочь. Я думаю (по крайней мере, временно) класс Robot — мой лучший вариант. - person Brian Pelc; 27.10.2012