当前位置:编程学习 > JAVA >>

java TextArea 中如何分行显示多行字符串

    想模拟一个聊天的小程序,可在一开始就有个问题不知道怎么解决,网上找了半天,也没有什么好的解决方法,还是得麻烦大家一下。
    问题描述:我想把输入到TextField中的字符串通过点击“发送”或者敲回车键使其显示到TextArea中,然后TextField清空。问题是每次TextField中的字符串都会覆盖TextArea中之前的字符串,而我想使所有的字符串都分行显示出来。就想qq聊天的界面一样。这个该怎么做呢,麻烦大家给点提示,谢谢。
我的代码:
package com.chat.lv;
import java.awt.*;
import java.awt.event.*;

public class ChatClient extends Frame{
TextField tf = new TextField(53);
TextArea ta = new TextArea();
Button bt = new Button("发送");
Panel p1 = new Panel();
Panel p2 = new Panel();
static int i = 0;

public void launchFrame(){
setBounds(300,300,300,300);
//setLayout(new GridLayout(2,1));
add(p1,BorderLayout.NORTH);
add(p2,BorderLayout.SOUTH);
p1.add(ta);
p2.setLayout(new FlowLayout());
p2.add(tf);
p2.add(bt);
pack();
setVisible(true);

addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

bt.addActionListener(new TFAction());
tf.addActionListener(new TFAction());
}

class TFAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
String s = tf.getText();
ta.setText("第" + i++ + "行:"+s);
tf.setText("");
}
}

public static void main(String[] args) {
new ChatClient().launchFrame();
}
}
--------------------编程问答-------------------- append(String str) 
将给定文本追加到文本区的当前文本。 --------------------编程问答--------------------
引用 1 楼 xiaozhou10 的回复:
append(String str) 
将给定文本追加到文本区的当前文本。

用append(String str),会在字符串后面添加,而前面的不会删除,这样就是一长串的字符串,
我想的是让每一次输入的字符串都分行显示出来。我在每次ta.setText()时加入换行符好像也不行,
他会把换行符直接显示出来。
--------------------编程问答--------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class TextAreaExample {
    public static void main(final String... args) {
        EventQueue.invokeLater(new Runnable(){
                @Override public void run() {
                    final JFrame frame = new JFrame("^_^");
                    final JTextArea history = new JTextArea();
                    final JTextField input = new JTextField();
                    frame.add(new JScrollPane(history), BorderLayout.CENTER);
                    frame.add(input, BorderLayout.PAGE_END);

                    final Action send = new AbstractAction("Send"){
                            @Override public void actionPerformed(final ActionEvent e){
                                String message = input.getText();
                                history.append(String.format("%s%n", message));
                                input.setText("");
                            }
                        };
                    input.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "SEND");
                    input.getActionMap().put("SEND", send);

                    frame.setPreferredSize(new Dimension(400,300));
                    frame.pack();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
    }
}
--------------------编程问答--------------------
引用 3 楼 huntor 的回复:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class TextAreaExample {
    public static void main(final String... args) {
        EventQueue.invokeLater(new Runnable(){
                @Override public void run() {
                    final JFrame frame = new JFrame("^_^");
                    final JTextArea history = new JTextArea();
                    final JTextField input = new JTextField();
                    frame.add(new JScrollPane(history), BorderLayout.CENTER);
                    frame.add(input, BorderLayout.PAGE_END);

                    final Action send = new AbstractAction("Send"){
                            @Override public void actionPerformed(final ActionEvent e){
                                String message = input.getText();
                                history.append(String.format("%s%n", message));
                                input.setText("");
                            }
                        };
                    input.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "SEND");
                    input.getActionMap().put("SEND", send);

                    frame.setPreferredSize(new Dimension(400,300));
                    frame.pack();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
    }
}
谢谢你的回答,但我刚开始学swing还没看呢。你看我写的代码改一改或只在awt下能实现你的代码的功能吗? --------------------编程问答-------------------- awt不熟悉,好像没有InputMap和ActionMap,需要自己处理一下事件。 --------------------编程问答--------------------
引用 2 楼 volvoxc 的回复:
Quote: 引用 1 楼 xiaozhou10 的回复:

append(String str) 
将给定文本追加到文本区的当前文本。

用append(String str),会在字符串后面添加,而前面的不会删除,这样就是一长串的字符串,
我想的是让每一次输入的字符串都分行显示出来。我在每次ta.setText()时加入换行符好像也不行,
他会把换行符直接显示出来。

分行显示append("\n") --------------------编程问答-------------------- 分行符 \n
建议还是用文本编辑器 --------------------编程问答--------------------
引用 6 楼 e274794140 的回复:
Quote: 引用 2 楼 volvoxc 的回复:

Quote: 引用 1 楼 xiaozhou10 的回复:

append(String str) 
将给定文本追加到文本区的当前文本。

用append(String str),会在字符串后面添加,而前面的不会删除,这样就是一长串的字符串,
我想的是让每一次输入的字符串都分行显示出来。我在每次ta.setText()时加入换行符好像也不行,
他会把换行符直接显示出来。

分行显示append("\n")
append("/n")的话,会把/n显示出来,而没有换行。 --------------------编程问答--------------------
引用 7 楼 chen870201 的回复:
分行符 \n
建议还是用文本编辑器
/n好像不行,会把/n显示出来,而不会换行。 --------------------编程问答--------------------
引用 8 楼 volvoxc 的回复:
Quote: 引用 6 楼 e274794140 的回复:

Quote: 引用 2 楼 volvoxc 的回复:

Quote: 引用 1 楼 xiaozhou10 的回复:

append(String str) 
将给定文本追加到文本区的当前文本。

用append(String str),会在字符串后面添加,而前面的不会删除,这样就是一长串的字符串,
我想的是让每一次输入的字符串都分行显示出来。我在每次ta.setText()时加入换行符好像也不行,
他会把换行符直接显示出来。

分行显示append("\n")
append("/n")的话,会把/n显示出来,而没有换行。

是"\n"不是"/n"
--------------------编程问答-------------------- 谢谢大家的帮助,我知道怎么写了,其实特别简单啊。用append(str+"\n");就行了。还是得再用点儿心。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,