【问题标题】:Java Chatbox appending additional white spaceJava Chatbox 附加额外的空格
【发布时间】:2019-11-21 23:26:56
【问题描述】:

我有一个简单的聊天框,其中包含以下代码:

public class Chatbox extends JFrame
{
    JPanel mainPanel;
    JTextArea inputField;
    JTextArea chatTextArea;
    JLabel chatLabel;
    boolean typing;
    Timer t;

    public Chatbox()
    {
        createAndShowGUI();
    }

    private void createAndShowGUI()
    {
        // Set frame properties
        setTitle("Plain Text Editor - <ID>");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // Create a JPanel and set layout
        mainPanel=new JPanel();
        mainPanel.setLayout(new GridLayout(0,1));


        // Create JTextField, add it.
        inputField=new JTextArea();

        //inputField.setWrapStyleWord(true);
        inputField.setLineWrap(true);

        JScrollPane sp = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        mainPanel.add(sp);

        // Add panel to the south,
        add(mainPanel,BorderLayout.SOUTH);


        // Add a KeyListener
        inputField.addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent ke)
            {    
                // If he presses enter, add text to chat textarea
                if(ke.getKeyCode()==KeyEvent.VK_ENTER) showLabel(inputField.getText());
            }


        });

        // Create a textarea
        chatTextArea=new JTextArea();

        // Make it non-editable
        chatTextArea.setEditable(false);

        // Set some margin, for the text
        chatTextArea.setMargin(new Insets(7,7,7,7));

        chatTextArea.setLineWrap(true);
        chatTextArea.setWrapStyleWord(true);


        // Set a scrollpane
        JScrollPane js=new JScrollPane(chatTextArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);  
        add(js);

        addWindowListener(new WindowAdapter(){
            public void windowOpened(WindowEvent we)
            {
                // Get the focus when window is opened
                inputField.requestFocus();
            }
        });

        setSize(400,400);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void showLabel(String text)
    {
        // If text is empty return
        if(text.trim().isEmpty()) return;

        // Otherwise, append text with a new line
        chatTextArea.append(text+"\n");

        // Set textfield and label text to empty string
        inputField.setText("");
    }
}

但是,当我按 Enter 键进入 TextArea 时,会附加一个额外的空间。我怎样才能使消息被单独附加而没有额外的空白?

我也不确定 JScrollPane 是否弄乱了间距,因为在我实施 JScrollPane 之前没有发生此问题。

【问题讨论】:

  • inputField.addKeyListener 是个坏主意,请改用ActionListener
  • 尝试反转 chatTextArea.append(text+"\n"); 以便新行作为文本的前缀

标签: java textarea


【解决方案1】:

chatTextArea.append(text+"\n"); 每次添加新文本时都会添加一个新行。

相反,您可以考虑在文本前加上一个新行(当文本已经存在于聊天窗口中时),例如...

private void showLabel(String text) {
    // If text is empty return
    if (text.trim().isEmpty()) {
        return;
    }

    if (!chatTextArea.getText().isEmpty()) {
        text = "\n" + text;
    }

    // Otherwise, append text with a new line
    chatTextArea.append(text);

    // Set textfield and label text to empty string
    inputField.setText("");
}

您的输入 JTextArea 也将额外增加一行(我花了一些时间才意识到,因为我期待 JTextField ?)

发生这种情况是因为KeyEvent.VK_ENTER 很可能在KeyListener 之前由JTextArea(及其底层Document)处理,这意味着新行现在实际上是文本的一部分。

您可以考虑在将文本发送到showLabel 方法之前对其进行修剪,例如...

inputField.addKeyListener(new KeyAdapter() {
    public void keyPressed(KeyEvent ke) {
        // If he presses enter, add text to chat textarea
        if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
            showLabel(inputField.getText().trim());
        }
    }
});

但是,更好的解决方案是尝试手动删除 String 末尾的空格,因为 trim 将删除前导和尾随空格,但我会让你弄清楚这一点

【讨论】:

  • 感谢您的回复。正如您所指出的,我确实相信JTextArea 是我的问题。似乎每个在线示例都使用JTextField 作为聊天输入。我使用JTextArea 的原因是我想允许用户多行在发送前编辑他们的消息。有点像我在键入此消息时正在做的事情。我还注意到,当我在发送一两条消息后全屏显示此聊天应用程序时,JTextArea 光标默认为第二行,这可能是问题所在?如果不是这样,我将尝试提出您在回复末尾提到的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 2011-06-01
  • 2021-01-27
  • 2019-09-10
相关资源
最近更新 更多