我正在開發一個聊天應用程序,當我在按住一個輸入按鈕對焦JTextArea時,我希望它停止添加不必要的新文本行,例如,我將能夠確定當用戶按下輸入按鈕並且沒有在JTextArea內輸入任何內容時。我使用KeyListener來檢測用戶何時釋放回車鍵併發送消息。我首先嚐試用空字符串message.replaceAll(「[\ n]」,「」)替換新的文本行,並修剪消息,但它不起作用。有什麼我在做我的方法錯了,還是會有任何其他的解決方案,我可以適應?JTextArea按Enter鍵添加不必要的新行
回答
- 請勿爲此使用JTextArea,而應使用JTextField。
- 然後,您可以通過給JTextField一個ActionListener輕鬆地監聽輸入新聞。
- 我見過的大多數Swing聊天應用程序都使用了兩個文本組件:一個用於顯示傳入文本和發送文本的JTextArea以及一個用於允許用戶輸入文本的JTextField。
通常一個使用BorderLayout在另一個之上。
如果你絕對必須使用一個JTextArea,那麼你可能需要使用密鑰綁定捕捉回車鍵和處理。檢查出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();
}
});
}
}
要替換的 「輸入」 的標準行爲的關鍵,你應該使用的輸入/行動地圖您的文本區域
請參閱方法registerKeyboardAction(ActionListener anAction,String aCommand,KeyStroke aKeyStroke,int aCondition)
。作爲行動監聽者,您應該從您的「發送」按鈕中執行操作,命令是您的選擇的字符串,關鍵行程爲KeyStroke.getKeyStroke(KeyEvent.VK_ENTER)
,條件爲JComponent.WHEN_FOCUSED
。
我不同意你的建議以查看'registerKeyboardAction'方法。根據[JComponent API](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html):''此方法現在已過時,請使用getActionMap()和getInputMap()類似的行爲。「再次更好地使用標準鍵綁定按照我的答案。 –
爲什麼?此方法在內部使用輸入/動作映射。 –
該方法可能正在成爲過時的方式。至於爲什麼,我不知道。您將希望與Java和Swing的開發人員和維護人員討論此問題。他們是把這個評論放在Java API中的人,而不是我。 –
- 1. Enter鍵在JTextArea中不起作用
- 2. Microsoft Access中按Enter鍵添加記錄
- 3. 多次運行批處理文件,而不必按ENTER鍵
- 4. 生成後按下ENTER鍵不能將新段落添加到賈斯珀報告文檔中ENTER ENTER
- 5. 按ENTER/RETURN鍵刷新頁面按
- 6. 按Enter鍵
- 7. 更新jtextarea的每個按鍵輸入
- 8. 通過按Enter鍵而不是逗號將新值添加到標記字段
- 9. 不要讓Enter鍵在MultiLine TextBox中創建新行C#
- 10. 運行JavaScript,如果按下按鍵!= ENTER
- 11. 添加Enter鍵作爲JButton加速器
- 12. 按Enter鍵繼續
- 13. ModelPopupExtender和Enter鍵按
- 14. 更新特性,而無需按Enter鍵
- 15. 按「Enter」鍵激活按鈕
- 16. JTextArea追加新行不起作用
- 17. 向JtextArea添加鍵監聽器
- 18. 當按下Enter鍵時,需要VB.net 2005幫助執行邏輯
- 19. 如何使用enter而不是按鈕JTextArea?
- 20. 添加「ENTER」鍵在Word 2010中VBA宏
- 21. 自動執行shell按Enter鍵繼續
- 22. 按ENTER鍵在datagridview中選擇一行
- 23. 自動執行等待您按ENTER鍵
- 24. 如何按下「Enter」鍵執行功能?
- 25. 在「enter」鍵被按下後添加到JList
- 26. 在文本框的按鍵事件中按下Enter鍵後取消Enter鍵
- 27. Shift + Enter不再在Visual Studio中添加新行
- 28. 增加執行時間添加不必要的JAR
- 29. 在不按Enter鍵的情況下捕捉EOF按鍵C
- 30. .NetCore HttpClient添加不必要的Accept-Enconding
改爲使用JTextField。 –