4

我正在编写一个在输入面板中包含多个 JTextField 和 2 个 JTextArea 的程序。我在底部有一个提交按钮。我已经设置好了,所以当用户在每个字段(包括 JTextAreas)中输入一些内容并点击 Enter 键时,它会更新一个文本文件,当他们按下提交按钮时它会更新文件,然后在其中输出一个新版本本地目录。

如果用户在任何字段中按 Enter,它会验证他们的输入,但是,我想在他们按下提交按钮时重新验证所有字段。每个字段(同样,包括 JTextAreas)在其 ActionListener 或 KeyListener(针对 JTextAreas)中都有自己的验证检查。对 JTextFields 使用 postActionEvent() 很容易,但是JTextAreas 是否有类似的方法来强制触发 KeyEvent? 我不想通过在 JButton 的 ActionEvent 中重写这两个组件的验证来复制代码并消耗内存。

不幸的是,我无法提供示例,因为我正在机密机器 (PC) 上编写程序。

4

2 回答 2

4

当您可以简单地调用您的方法(例如在伪代码中)时,为什么要尝试发布KeyEvent来触发验证validate

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

}

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

private function submitButtonFunction(){
  validate();
}

另请注意,DocumentListener如果您想对 a 中的输入做出反应,推荐的方法是使用 a JTextComponent。例如,您KeyListener不会在拖放后触发。根据您的实现,KeyListener当您使用复制粘贴时,它也可能会失败。

于 2012-10-26T18:28:41.703 回答
3

您可以使用类和方法模拟ENTER被按下。您当然必须遍历组件上的所有内容并调用模拟按键(省略处理):RobotkeyPress(..)keyRelease(..)JTextAreasrequestFocusInWindow(..)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);
}
于 2012-10-26T18:55:54.173 回答