Java JTextArea按enter键可添加不必要的新行

Java JTextArea按enter键可添加不必要的新行,java,swing,jtextarea,keylistener,key-bindings,Java,Swing,Jtextarea,Keylistener,Key Bindings,我正在开发一个聊天应用程序,当我在关注JTextArea时按下enter按钮时,我希望它停止添加不必要的新文本行,因此,例如,我将能够确定用户何时按下enter按钮并且没有在JTextArea内键入任何内容。我使用KeyListener来检测用户何时释放了enter键,然后发送消息。我首先尝试用空字符串消息替换新的文本行。replaceAll(“[\n]”,“”)并修剪消息,但没有效果。我的方法是否有什么地方做错了,或者是否有其他解决方案可以采用? 不要为此使用JTextArea,而是使用JTe

我正在开发一个聊天应用程序,当我在关注JTextArea时按下enter按钮时,我希望它停止添加不必要的新文本行,因此,例如,我将能够确定用户何时按下enter按钮并且没有在JTextArea内键入任何内容。我使用KeyListener来检测用户何时释放了enter键,然后发送消息。我首先尝试用空字符串消息替换新的文本行。replaceAll(“[\n]”,“”)并修剪消息,但没有效果。我的方法是否有什么地方做错了,或者是否有其他解决方案可以采用?

  • 不要为此使用JTextArea,而是使用JTextField
  • 然后,通过给JTextField一个ActionListener,您可以轻松地监听enter键
  • 我见过的大多数Swing聊天应用程序都使用两个文本组件:一个JTextArea用于显示传入文本和发送的文本,另一个JTextField用于允许用户输入要发送的文本
  • 通常一个在另一个的正上方使用边界布局


  • 如果您绝对必须使用JTextArea,那么您可能需要使用键绑定来捕获并处理enter键。看看这本书


例如:

密钥绑定解决方案示例:
要替换“回车”键的标准行为,应使用文本区域的输入/动作映射


请参阅方法
registerKeyboardAction(ActionListener操作、String命令、击键aKeyStroke、int条件)
。作为动作监听器,您应该从“发送”按钮执行动作,命令是您选择的字符串,击键是
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER)
,条件是
JComponent。当您专注于

时,这是适合我的系统的解决方案

AddTxtA.getDocument().putProperty("filterNewlines", Boolean.TRUE);
**当用户按下JText区域中的“回车”按钮时,将输入一个空格而不是新行。下面显示了两种不同情况下的示例输出

1) 不带AddTxtA.getDocument().putProperty(“filterNewlines”,Boolean.TRUE)

输出:“我的名字

是亚当。”

2) 使用AddTxtA.getDocument().putProperty(“filterNewlines”,Boolean.TRUE)

输出:“我的名字是亚当。”


改用JTextField。好的,谢谢你的回答,但是我已经注意到JTextField不允许换行。我如何在文本字段中恢复此功能?我真的希望滚动保持垂直+换行,否则如果不可能的话,我可能会寻求jtextraeperfect的解决方案,它通过设置自定义密钥绑定的方式与JTextArea一起工作。谢谢:)对于任何有同样问题的人来说,这也是一个很好的参考资料。我不同意你关于查看
registerKeyboardAction
方法的建议。根据:
“此方法现在已过时,请结合使用getActionMap()和getInputMap()来实现类似的行为。”
根据我的回答,最好还是使用标准键绑定。为什么?此方法在内部使用输入/操作映射。该方法可能会被弃用。至于为什么,我不知道。您将希望与Java和Swing的开发人员和维护人员讨论这一点。他们是把这个评论放在JavaAPI中的人,而不是我。正如我所知,这个方法从Java1.3开始就过时了。因此,我认为我们可以在未来10年内使用它,而不会收到弃用警告;)如果您更喜欢在代码中使用过时和不推荐的方法,那么就这样吧,但建议其他人在so中这样做并不是一个好主意,尤其是当存在非过时和不推荐的方法时。
AddTxtA.getDocument().putProperty("filterNewlines", Boolean.TRUE);