Java: Text Area

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Lớp JTextArea cung cấp một thành phần cho phép hiển thị và nhập nhiều dòng văn bản. Ảnh dưới đây thể hiện một ví dụ về việc sử dụng text để nạp dữ liệu.

A snapshot of TextDemo

Ta có thể tìm thấy toàn bộ ứng dụng liên quan tại ví dụ TextDemo. Đoạn mã sau đây dùng để tạo và khởi tạo text area:

textArea = new JTextArea(5, 20);
JScrollPane scrollPane = new JScrollPane(textArea);
textArea.setEditable(false);

Hai đối số của hàm tạo JTextArea tương ứng với số hàng và số cột của text area. Câu lệnh thứ hai sẽ đưa text area vào thanh cuộn scrollPane.

Text area không nên tự động có thanh cuộn, thanh cuộn lúc này sẽ xuất hiện ở scroll pane rồi.

Mặc định thì text area cho phép người dùng điền dữ liệu, nếu ta không muốn điều này thì ta sử dụng phương thức setEditable(false). Phương thức này sẽ không cho người dùng thay đổi nội dung mà text area đang chứa, nhưng vẫn cho phép sao chép nội dung đó.

Đoạn mã sau sẽ thêm văn bản cho text area, ta có thể sử dụng ký tự '\n' để xuống dòng.

private final static String newline = "\n";
...
textArea.append(text + newline);

Ta có thể thiết lập hiệu ứng cho phép text area cuộn xuống vị trí cuối bằng cách sử dụng phương thức sau:

textArea.setCaretPosition(textArea.getDocument().getLength());

Tùy chỉnh cho Text Area

Đoạn mã sau trích từ ví dụ TextSamplerDemo dùng để khởi tạo và chỉnh sửa nội dung trong text area:

JTextArea textArea = new JTextArea(
    "This is an editable JTextArea. " +
    "A text area is a \"plain\" text component, " +
    "which means that although it can display text " +
    "in any font, all of the text is in the same font."
);
textArea.setFont(new Font("Serif", Font.ITALIC, 16));
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);

Mặc định thì text area không gộp các dòng quá dài để hiển thị, thay vào đó nó sẽ sử dụng một dòng hiển thị và như vậy sẽ xuất hiện thanh cuộn ngang nếu dòng đó dài hơn kích thước chiều rộng đã tạo. Ví dụ sau sẽ gọi phương thức setWrapStyleWord để gộp các dòng.

JScrollPane areaScrollPane = new JScrollPane(textArea);
areaScrollPane.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
areaScrollPane.setPreferredSize(new Dimension(250, 250));

Ở đoạn mã trên ta thấy hàm tạo JTextArea không xác định số hàng và số cột, thay vào đó kích thước của text area được thiết lập bằng cách thiết lập kích thước cho scroll pane.

Ví dụ TextAreaDemo

Ví dụ TextAreaDemo giới thiệu một text area cho phép biên soạn với chức năng đặc biệt là gợi ý hoàn thành từ. Theo đó, khi ta soạn một từ thì chương trình sẽ đoán và gợi ý một từ hoàn chỉnh nếu như những từ trước đó đã soạn có từ tương ứng. Dưới đây là hình ảnh ví dụ về ứng dụng TextAreaDemo này.

A snapshot of TextAreaDemo

Bạn có thể xem toàn bộ code ví dụ tại phần TextAreaDemo.

Trong ví dụ này có cung cấp một thanh cuộn cho text area. Mặc định thì thanh cuộn dọc chỉ xuất hiện nếu phần văn bản điền vào vượt quá kích thước chiều cao. Để nạp thanh cuộn cho text area ta làm như sau:

  textArea.setWrapStyleWord(true);
  jScrollPane1 = new JScrollPane(textArea);

Ta có thể soạn cũng như dán và xóa văn bản ở text area.

Bây giờ ta xét đến chức năng đoán từ để đưa ra gợi ý hoàn thành từ. Giả sử ta đã soạn một từ là "Swing" rồi sau đó ta soạn "sw" thì khi đó chương trình sẽ gợi ý thêm "ing" phía sau, khi đó ta sẽ nhấn Enter nếu đồng ý gợi ý đó.

Đoạn mã sau thêm một document listener tới document của text area:

textArea.getDocument().addDocumentListener(this);

Khi bạn soạn từ thì phương thức insertUpdate sẽ kiểm tra xem từ vựng của chương trình xem có từ nào bắt đầu bằng các ký tự vừa soạn không, nếu tìm thấy thì sẽ gọi tới phương thức invokeLater để gửi tác vụ cho phép thay đổi document sau đó. Ở đây ta không thể sửa được tài liệu khi đang xuất hiện dòng nhắc sự kiện tài liệu. Đoạn mã sau thể hiện mô tả này:

String prefix = content.substring(w + 1).toLowerCase();
int n = Collections.binarySearch(words, prefix);
if (n < 0 && -n <= words.size()) {
    String match = words.get(-n - 1);
    if (match.startsWith(prefix)) {
        // Nếu tìm thấy từ hoàn chỉnh
        String completion = match.substring(pos - w);
        // Thì gửi một tác vụ để xử lý sau,
        // do ta không thể thay đổi document khi đang có dòng nhắc
        SwingUtilities.invokeLater(
            new CompletionTask(completion, pos + 1));
    }
} else {
    // Nếu không tìm thấy
    mode = Mode.INSERT;
}

Phần chữ đậm của đoạn mã dưới đây sẽ minh họa cách chọn từ hoàn chỉnh để điền vào từ đang soạn thảo. Con nháy soạn thảo (caret) trước tiên sẽ được đặt ở cuối của từ hoàn chỉnh rồi được di chuyển ngược về ký tự đầu tiên của từ đó. Phương thức moveCaretPosition không chỉ di chuyển con nháy soạn thảo mà đồng thời nó còn chọn phần văn bản giữa hai vị trí đầu và cuối đó:

  private class CompletionTask implements Runnable {
        String completion;
        int position;

        CompletionTask(String completion, int position) {
            this.completion = completion;
            this.position = position;
        }

        public void run() {
            textArea.insert(completion, position);
            textArea.setCaretPosition(position + completion.length());
            textArea.moveCaretPosition(position);

            mode = Mode.COMPLETION;
        }
    }

API Text Area

Các bảng dưới đây liệt kê các hàm tạo và phương thức phổ biến của JTextArea và JTextComponent.

Thiết lập hoặc lấy nội dung

Phương thức hoặc hàm tạo Mô tả
JTextArea()
JTextArea(String)
JTextArea(String, int, int)
JTextArea(int, int)
Tạo một text area. Đối số String chứa văn bản khởi tạo. Các đối số kiểu int dùng để xác định số hàng và số cột cho text area.
void setText(String)
String getText()
(được định nghĩa trong JTextComponent)
Thiết lập hoặc lấy văn bản trong text area.

 

Fine Tuning the Text Area's Appearance

Phương thức Mô tả
void setEditable(boolean)
boolean isEditable()
(được định nghĩa trong JTextComponent)
Thiết lập hoặc chỉ ra nơi người dùng có thể biên soạn văn bản trong text area.
void setColumns(int);
int getColumns()
Thiết lập hoặc lấy số cột của text area.
void setRows(int);
int getRows()
Thiết lập hoặc lấy số hàng của text area.
int setTabSize(int) Thiết lập tabsite cho text area.
int setLineWrap(boolean) Thiết lập số dòng sẽ được gộp nếu những dòng đó có chiều dài vượt quá chiều rộng  của text area. Mặc định thì các dòng không được gộp.
int setWrapStyleWord(boolean) Thiết lập xem các dòng có thể được gộp tại vị trí của một ký tự nào đó hay không. Mặc định thì đối số chứa giá trị false và các dòng có thể được gộp ở bất kỳ ký tự nào.

 

Implementing the Text Area's Functionality

Phương thức Mô tả
void selectAll()
(được định tại JTextComponent)
Chọn tất cả các ký tự trong text area.
void append(String) Thêm văn bản vào phía cuối của text area.
void insert(String, int) Chèn văn bản vào một vị trí xác định.
void replaceRange(String, int, int) Thay thế văn bản giữa các vị trí được chỉ ra bằng một chuỗi mới.
int getLineCount()
int getLineOfOffset(int)
int getLineStartOffset(int)
int getLineEndOffset(int)
Dùng để tìm số dòng hay vị trí bắt đầu hoặc kết thúc của dòng hiện thời.

 

Các ví dụ có sử dụng Text Area

Dưới đây là liệt kê các ví dụ có sử dụng text area:

Nguồn: http://docs.oracle.com/javase/tutorial/uiswing/components/textarea.html

» Tiếp: Cách sử dụng Text Field (JTextField)
« Trước: Cách sử dụng bảng (Table)
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!