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