gpt4 book ai didi

java - JTextArea 按回车添加不必要的新行

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:29 25 4
gpt4 key购买 nike

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

最佳答案

  • 不要为此使用 JTextArea,而是使用 JTextField。
  • 然后,您可以通过为 JTextField 提供一个 ActionListener 来轻松监听输入按键。
  • 我见过的大多数 Swing 聊天应用程序为此使用两个文本组件:一个 JTextArea 用于显示传入文本和您发送的文本,一个 JTextField 允许用户输入要发送的文本。
  • 通常使用 BorderLayout,一个位于另一个之上。


  • 如果您绝对必须使用 JTextArea,那么您可能希望使用键绑定(bind)来捕获回车键并对其进行处理。查看How to use Key Bindings Tutorial .


例如:

示例键绑定(bind)解决方案:

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();
}
});
}
}

关于java - JTextArea 按回车添加不必要的新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19569302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com