Java Swing: Как получить значение TextArea, включая только что набранный символ? - PullRequest
1 голос
/ 26 января 2010

Какой лучший способ получить значение TextArea после ввода ключа, включая этот символ?

Если я делаю это в четном слушателе, textarea.getText() возвращает значение без возможного нового символа.

В основном я вижу два пути:

  1. откладывает обработку с помощью что-то вроде invokeLater (). Я бы предпочел решение без потоков.

  2. выяснение, куда поместить символ в текст, исходя из положения каретки.

Есть ли что-нибудь более простое?

Спасибо.

Редактировать: Вот что у меня есть:

JTextArea textarea = (JTextArea) evt.getComponent();
String texySource = textarea.getText();
char keyCode = evt.getKeyChar();
//if( Character.isLetterOrDigit( keyCode ) || Character.isSpaceChar( keyCode )  )
if( keyCode >= 0x20 || keyCode == 0x0A || keyCode == 0x0D  ){
    // TODO: The carret doesn't have to be at the end...
    //texySource += Character.toString( evt.getKeyChar() );

    String ch = Character.toString( evt.getKeyChar() );
    texySource = StringUtils.overlay(texySource, ch,
    textarea.getSelectionStart(),
    textarea.getSelectionStart()    );
}

Ответы [ 3 ]

2 голосов
/ 26 января 2010

Рассматривали ли вы прослушиватель документов? возможно, вооружен вводом события?

class TheListener implements DocumentListener, KeyListener {
  boolean armed;

  void keyPressed(KeyEvent ignore) { }
  void keyReleased(KeyEvent ignore) { }
  void keyTyped(KeyEvent e) {
    armed = true;
    SwingUtilities.invokeLater(new Runnable() { public void run() {
      armed = false;
    }
  }

  void deleteUpdate(DocumentEvent e) {
    changeUpdate(e);
  }
  void insertUpdate(DocumentEvent e) {
    changeUpdate(e);
  }
  void changedUpdate(DocumentEvent e) {
    if (armed) {
      String s = ((JTextComponent)e.getSource()).getText();
      //.... whatever you want to do now
    }
  }
}

//...
TheListener aListener = new TheListener();
textArea.addKeyListener(aListener);
textArea.getDocument().addDocumentListener(aListener);

Теория состоит в том, чтобы поставить слушателя изменения документа на набранный ключ, а затем добавить событие EDT для его снятия с охраны. Изменения документа произойдут в первую очередь перед снятием с охраны. После постановки на охрану вы можете предположить, что любые изменения документа были вызваны в некоторой части событием ввода ключа. (предупреждение, я не скомпилировал этот код, YMMV).

1 голос
/ 26 января 2010

Вам необходимо использовать DocumentListener и записать код одним из методов xxxupdate ().

0 голосов
/ 26 января 2010

Вы пытались зарегистрировать KeyListener с пользовательской реализацией keyReleased (KeyEvent e)?

проверьте API здесь: KeyListener

Учебник Sun с примерами: Как написать Key Listener

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...