JTextArea按下Enter添加不必要的新行

Adr*_*ian 3 java swing keylistener key-bindings jtextarea

我正在开发一个聊天应用程序,当我将焦点放在JTextArea上时按Enter键时,我希望它停止添加不必要的新行文本,因此例如,我将能够确定用户何时按下了Enter键而未键入JTextArea中的任何内容。我正在使用KeyListener来检测用户何时释放Enter键,然后发送消息。我首先尝试用空字符串message.replaceAll(“ [\ n]”,“”)替换新的文本行,并修剪消息,但是没有用。我的方法有什么问题吗?还是可以采用其他解决方案?

Hov*_*els 5

  • 请勿为此使用JTextArea,而应使用JTextField。
  • 然后,可以通过给JTextField一个ActionListener来轻松地听回车新闻。
  • 我见过的大多数Swing聊天应用程序为此使用两个文本组件:一个JTextArea用于显示传入的文本和您发送的文本,以及一个JTextField允许用户输入要发送的文本。
  • 通常,使用BorderLayout可以使一个位于另一个之上。


  • 如果您绝对必须使用JTextArea,则可能要使用“键绑定”来捕获Enter键并对其进行处理。查看如何使用键绑定教程


例如:

示例键绑定解决方案:

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();
         }
      });
   }
}
Run Code Online (Sandbox Code Playgroud)