我正在开发一个聊天应用程序,当我在聚焦JTextArea时按下回车按钮我希望它停止添加不必要的新文本行,所以例如我将能够确定用户何时按下了回车按钮而不是在JTextArea中输入任何内容。我正在使用KeyListener来检测用户何时释放回车键然后发送消息。我首先尝试使用空字符串message.replaceAll(“[\ n]”,“”)替换新的文本行,并修剪消息,但它不起作用。我的方法有什么问题吗?或者我能适应其他任何解决方案吗?
答案 0 :(得分:4)
通常使用BorderLayout将其中一个放在另一个上面。
如果您绝对必须使用JTextArea,那么您可能希望使用Key Binding来捕获回车键并处理它。查看How to use Key Bindings Tutorial。
例如:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class CaptureTextAreaEnter extends JPanel {
private static final int COLS = 30;
private static final int VIEW_ROWS = 12;
private static final int ENTER_ROWS = 4;
private JTextArea chatViewArea = new JTextArea(VIEW_ROWS, COLS);
private JTextArea chatEnterArea = new JTextArea(ENTER_ROWS, COLS);
public CaptureTextAreaEnter() {
setLayout(new BorderLayout());
add(new JScrollPane(chatViewArea), BorderLayout.CENTER);
add(new JScrollPane(chatEnterArea), BorderLayout.SOUTH);
chatViewArea.setFocusable(false);
chatViewArea.setWrapStyleWord(true);
chatEnterArea.setWrapStyleWord(true);
chatViewArea.setLineWrap(true);
chatEnterArea.setLineWrap(true);
// start our set up of key bindings
// to get the correct InputMap
int condition = WHEN_FOCUSED;
// get our maps for binding from the chatEnterArea JTextArea
InputMap inputMap = chatEnterArea.getInputMap(condition);
ActionMap actionMap = chatEnterArea.getActionMap();
// the key stroke we want to capture
KeyStroke enterStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
// tell input map that we are handling the enter key
inputMap.put(enterStroke, enterStroke.toString());
// tell action map just how we want to handle the enter key
actionMap.put(enterStroke.toString(), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent arg0) {
String text = chatEnterArea.getText();
chatEnterArea.setText("");
chatViewArea.append(text + "\n");
// *** you will want to send text to your
// *** PrintStream to the chat server here
}
});
}
private static void createAndShowGui() {
CaptureTextAreaEnter mainPanel = new CaptureTextAreaEnter();
JFrame frame = new JFrame("CaptureTextAreaEnter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
答案 1 :(得分:0)
这是适用于我的系统的解决方案。
AddTxtA.getDocument().putProperty("filterNewlines", Boolean.TRUE);
**当用户按下"输入"在JTextArea中的按钮,将输入一个空格而不是新行。下面显示了两种不同情况下的示例输出。
1)没有 AddTxtA.getDocument()。putProperty(" filterNewlines",Boolean.TRUE);。
输出: "我的名字
是亚当。"
2)使用 AddTxtA.getDocument()。putProperty(" filterNewlines",Boolean.TRUE); 。
输出: "我的名字是亚当。"
答案 2 :(得分:-1)
要替换“enter”键的标准行为,您应该使用文本区域的输入/动作映射
请参阅方法registerKeyboardAction(ActionListener anAction,String aCommand,KeyStroke aKeyStroke,int aCondition)
。作为动作监听器,您应该从“发送”按钮执行操作,命令是您选择的字符串,键击是KeyStroke.getKeyStroke(KeyEvent.VK_ENTER)
,条件是JComponent.WHEN_FOCUSED
。