java.lang.Object
--java.awt.Component
--java.awt.Container
--javax.swing.JCompontent
--javax.swing.text.JTextComponent
--javax.swing.JTextArea
JTextArea继承JTextComponent为类,因此它也可以使用JTextComponent抽象类里面许多好用的方法,如compy(),paste(), setText(),isEditable()等等。我们在前面有提到JTextArea是一个多行的输入组件,在这个组件中可以利用Enter来做换行的操作 。
在使用JTextArea之前,我们先看看JTextArea有哪些构造函数可以使用:
我们可以发现到JTextArea的构造函数和JTextField及JPasswordField的构造函数是相同雷同,而JTextArea多了一个字段的参数 值是因为JTextArea是二维的输入组件,在构造时不仅要设置字段长度也要设置行数。我们来看下面这个范例:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JTextArea1 {
public static void main(String[] args) {
JFrame f = new JFrame("JTextArea1");
Container contentPane = f.getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel p1 = new JPanel();
p1.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(2, 2, 2, 2);
p1.setBorder(BorderFactory.createTitledBorder("构造一般的JTextArea"));
JLabel l1 = new JLabel("一:");
JLabel l2 = new JLabel("二:");
JLabel l3 = new JLabel("三:");
JLabel l4 = new JLabel("四:");
JTextArea t1 = new JTextArea();
JTextArea t2 = new JTextArea(2, 8);
JTextArea t3 = new JTextArea("JTextArea3");
JTextArea t4 = new JTextArea("JTextArea4", 5, 10);
t1.setText("JTextArea1");// setText()方法会将原来的内容清除
t2.append("JTextArea2");// append()方法会将设置的字符串接在原来JTextArea内容文字之后.
t4.setLineWrap(true);// 设置换行
gbc.gridy = 1;
gbc.gridx = 0;
p1.add(l1, gbc);
gbc.gridx = 1;
p1.add(t1, gbc);
gbc.gridy = 2;
gbc.gridx = 0;
p1.add(l2, gbc);
gbc.gridx = 1;
p1.add(t2, gbc);
gbc.gridy = 3;
gbc.gridx = 0;
p1.add(l3, gbc);
gbc.gridx = 1;
p1.add(t3, gbc);
gbc.gridy = 4;
gbc.gridx = 0;
p1.add(l4, gbc);
gbc.gridx = 1;
p1.add(t4, gbc);
contentPane.add(p1);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
在JTextArea中我们可以使用setTabSize()方法设置[Tab]键的跳离距离,或是setFont()方法设置字体。当我们输入的文字超过 JTextArea的右边界及下边界时,会看不到接下来打的内容,那该怎么办呢?你可以使用JScrollPane使JTextArea具备滚动的能力, 或是搭配setLineWrap()方法就能让文字自动换行。JTextArea还提供一个setWrapStyleWord()方法,可以让换行的时候不会造成断 字的现象,这在Word或使用OutLook写信时都可以看到这个效果。例如我们在行尾中输入“自动换行”四个字,但此行最多只能在容 纳两个字,因此JTextArea会将此四个字均移到下一行,不会造成“自动”在上行,"换行"在下行的情形。这在处理英文输入上较为 重要,因为setWrapStyleWord()是利用空白当作是一个字输入的结果。我们来看下面的范例:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JTextArea2 {
public static void main(String[] args) {
JFrame f = new JFrame("JTextArea2");
Container contentPane = f.getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(1, 1));
p1.setBorder(BorderFactory
.createTitledBorder("构造TextArea-使用GridLayout,加ScrollBar"));
JTextArea t1 = new JTextArea(5, 25);
t1.setTabSize(10);
t1.setFont(new Font("标楷体", Font.BOLD, 16));
t1.setLineWrap(true);// 激活自动换行功能
t1.setWrapStyleWord(true);// 激活断行不断字功能
p1.add(new JScrollPane(t1));// 将JTextArea放入JScrollPane中,这样就能利用滚动的效果看到输入超过JTextArea高度的
// 文字.
contentPane.add(p1);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
我们再举一个例子,使JTextArea具有copy、paste、cut的功能:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JTextArea3 implements ActionListener {
JTextArea textarea = null;
JButton b1, b2, b3;
public JTextArea3() {
JFrame f = new JFrame("JTextArea3");
Container contentPane = f.getContentPane();
contentPane.setLayout(new BorderLayout());
textarea = new JTextArea(10, 15);
JScrollPane scrollPane = new JScrollPane(textarea);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1, 3));
b1 = new JButton("Copy");
b1.addActionListener(this);
b2 = new JButton("Paste");
b2.addActionListener(this);
b3 = new JButton("Cut");
b3.addActionListener(this);
panel.add(b1);
panel.add(b2);
panel.add(b3);
contentPane.add(scrollPane, BorderLayout.CENTER);
contentPane.add(panel, BorderLayout.SOUTH);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new JTextArea3();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1) {
textarea.copy();
}
if (e.getSource() == b2) {
textarea.paste();
}
if (e.getSource() == b3) {
textarea.cut();
}
}
}