Текстовые области Java

Иногда при работе программы возникает необходимость ввести несколько строк. Для этого применяется компонент JTextArea. Поместив данный компонент в свою программу, разработчик предоставляет пользователю возможность вводить любое количество текста, разделяя строки нажатием клавиши <Enter>.

Каждая строка заканчивается символом ‘\n‘, как это предусмотрено в языке Java. Пример работы текстовой области показан на рис.1.

В конструкторе компонента JTextArea указывается количество строк и их длина. Например:

textArea = new JTextArea(8, 40); // 8 строк по 40 символов в каждой.

Параметр, задающий количество символов в строке, действует так же, как и для поля редактирования, его значение рекомендуется немного завысить. Пользователь не органичен количеством строк и их длинной. Если длина строки или чисто строк выйдет за пределы заданных параметров, текст будет прокручиваться в окне.

Для изменения длины строк можно применять метод setColumns(), а для изменения их количества — метод setRows(). Эти параметры задают лишь рекомендуемые размеры — диспетчер компоновки может самостоятельно увеличивать или уменьшать размеры поля редактирования.

Текстовые области Java

Рис.1. Текстовая область

Если пользователь ввел больше текста, чем умещается в текстовой области, про произойдет отсечение. Этого можно избежать, установив автоматический перенос строки(line-wrapping).

textArea.setLineWrap(true); // В длинных строках выполняется перенос.

Автоматический перенос проявляется лишь визуально. Текст хранящийся в документе, изменен не будет — в него не вставляются символы ‘\n’.

В пакете Swing текстовая область не имеет полос прокрутки. Если они необходимы, текстовую область следует включить в панель прокрутки(scroll pane):

textArea = new JTextArea(8, 40);
JScrollPane scrollPane = new JScrollPane(textArea);

Теперь панель прокрутки управляет представлением текстовой области. Полоса прокрутки автоматически появляется, когда текст выходит из рамки отведенной для него области, и исчезает, когда «лишняя» часть текста удаляется. Прокрутка поддерживается панелью прокрутки — сама программа не обязана обрабатывать события, связанные с ней.

Это универсальный механизм, который работает с любым компонентом, а не только с текстовыми областями. Чтобы добавить линейки прокрутки к компоненту, поместите его в панель прокрутки.

Программа которая приведена ниже демонстрирует различные текстовые компоненты. Эта программа отображает текстовое поле, поле пароля и текстовую область с линейками прокрутки. Текстовое поле и поле пароля снабжены метками. Чтобы вставить предложение в конец текста, щелкните на кнопке Insert(Вставить).

Вот собственно код программы:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class TextComponentTest {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable()
		{
			public void run()
			{
				TextComponentFrame frame = new TextComponentFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}

}
class TextComponentFrame extends JFrame
{
	public TextComponentFrame()
	{
		setTitle("TextComponentTest");
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
		
		final JTextField textField = new JTextField();
		final JPasswordField passwordField = new JPasswordField();
		
		JPanel northPanel = new JPanel();
		northPanel.setLayout(new GridLayout(2,2));
		northPanel.add(new JLabel("User name: ", SwingConstants.RIGHT));
		northPanel.add(textField);
		northPanel.add(new JLabel("Password: ", SwingConstants.RIGHT));
		northPanel.add(passwordField);
		
		add(northPanel, BorderLayout.NORTH);
		
		final JTextArea textArea = new JTextArea(8, 40);
		JScrollPane scrollPane = new JScrollPane(textArea);
		
		add(scrollPane, BorderLayout.CENTER);
		
		JPanel southPanel = new JPanel();
		
		JButton insertButton = new JButton("Insert");
		southPanel.add(insertButton);
		insertButton.addActionListener(new ActionListener() {		
		public void actionPerformed(ActionEvent event) {
			textArea.append("User name: " + textField.getText() + " Password: " + new String(passwordField.getPassword()) + "\n");
			}
		});
		
		add(southPanel, BorderLayout.SOUTH);
	}
	public static final int DEFAULT_WIDTH = 300;
	public static final int DEFAULT_HEIGHT = 300;
}