【问题标题】:Java Swing: How to get TextArea value including the char just typed?Java Swing:如何获取 TextArea 值,包括刚刚输入的字符?
【发布时间】:2010-01-26 02:03:43
【问题描述】:

在键入键(包括此字符)后获取 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()    );
}

【问题讨论】:

  • 查看stackoverflow.com/questions/1252698/… 了解一些可能的见解。
  • 你到底想达到什么目的?
  • 我想获取包含字符(用户刚刚输入)的文本。
  • 您想只为“键入的键”专门获取它 - 还是要添加任何文本 - 例如,复制粘贴到文本区域? - 如果是第二个,您可以使用@shemnon 的 DocumentListener 示例,而无需使用所有“武装/解除武装”线程内容。

标签: java swing events textarea


【解决方案1】:

您是否考虑过文档侦听器?可能被打字事件武装起来?

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) 它引入了一个线程,所以我想我必须同步,2) 它并不简单 ;-) 但是getDocument() 是个好点,我会记住的以后再说……
【解决方案2】:

您需要使用 DocumentListener 并在 xxxupdate() 方法之一中编写您的代码。

【讨论】:

    【解决方案3】:

    您是否尝试使用 keyReleased(KeyEvent e) 的自定义实现注册 KeyListener ?

    在这里查看 api:KeyListener

    sun 的例子教程:How to write a Key Listener

    【讨论】:

    • 其实我用的是KeyListener...上面的代码来自它的实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2013-06-18
    • 2018-05-14
    • 1970-01-01
    • 2011-07-31
    • 2019-05-20
    相关资源
    最近更新 更多