Java: JEditorPane

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

JEditorPane là một thành phần văn bản dùng để hiển thị và biên soạn các loại plain, HTML và RTF. Văn bản có thể có các style khác nhau.

JEditorPane được tạo bằng cách sử dụng một trong các hàm tạo được mô tả trong bảng dưới đây.

Hàm tạo Mô tả Ví dụ
JEditorPane() Tạo một JEditorPane mà không có văn bản khởi tạo. JEditorPane epnEditor;
epnEditor = new JEditorPane();
JEditorPane(String url) throws IOException Tạo một JEditorPane với nội dung là một url. url là một chuỗi xác định đường dẫn tới trang hoặc tài liệu được hiển thị. JEditorPane epnEditor;
epnEditor = new JEditorPane(“http://java.sun.com/index.html”);
JEditorPane(URL url) throws IOException Tạo một JEditorPane với nội dung là một đối tượng URL. JEditorPane epnEditor;
// Tạo một đối tượng URL
URL url = new URL(“http://java.sun.com/index.html”);
// Tạo JEditorPane với đối tượng url ở trên
epnEditor = new JEditorPane(url);
JEditorPane(String type, String text) Tạo JEditorPane với kiểu MIME (Multi Purpose Internet Mailing Extension (MIME) và văn bản được khởi tạo.
Đối số type là một kiểu MIME, nó có thể là một trong các giá trị sau:
text/plain
text/rtf

text: Là văn bản khởi tạo cho JEditorPane.
// Tạo một đối tượng của URL
URL url = new URL(“http://java.sun.com/index.html”);
/* Tạo một JEditorPane với URL và MIME cụ thể */
epnEditor = new JEditorPane(url, ”text/html”);

Để hiển thị JEditorPane thì ta truyền một thể hiện của JEditorPane tới hàm tạo của JScrollPane và thêm JScrollPane tới bộ chứa.

Đoạn mã sau mô tả cách hiển thị JEditorPane trong frame.

JEditorPane epnEditor; 
JFrame frmEditor;
. . .
// Cung cấp editor pane tới scroll pane hiển thị có thành cuộn
JScrollPane scpScroller = new JScrollPane(epnEditor);

// Thêm JScrollPane tới frame
frmEditor.getContentPane().add(scpScroller);

2.6.6 Các phương thức của JEditorPane

Để tải văn bản vào JEditorPane thì bạn có thể sử dụng hàm tạo hoặc một trong hai phương thức được thể hiện trong bảng sau đây:

Phương thức Mô tả Ví dụ
public void setText(String text)

Dùng để thiết lập văn bản vào JEditorPane. 

Đối số text là nội dung văn bản sẽ được hiển thị trong JEditorPane.

String info;
. . .
info = “Once upon a time,……”;
// Thiết lập văn bản trong editor pane
epnEditor.setText(info);
public void 
setPage(URL url) 
throws IOException

Dùng để hiển thị nội dung của trang web được tham chiếu theo url.

Đối số url là một đối tượng của lớp java.net.URL dùng để xác định đường dẫn tới trang web sẽ được tải vào JEditorPane.

try

/* Tạo một đối tượng URL chứa một url cụ thể */
URL url = new URL(“http://java.sun.com/index.html”); 
/* Hiển thị nội dung của trang web ứng với url trong JEditorPane */
epnEditor.setPage(url); 

catch (IOException ex) 

. . . 
. . .
}

Lưu ý: phương thức setPage() phải nằm trong khối try-catch vì nó có thể ném ngoại lệ IOException.

2.6.7 Tìm hiểu thêm về JEditorPane

Như đã nói ở trên, HTML và RTF là hai định dạng được hỗ trợ bởi JEditorPane. Các bộ biên soạn do người dùng định nghĩa có thể được phát triển để xử lý trên từng ứng dụng cụ thể. Theo đó, trước tiên phương thức setContentType() phải được gọi để xác định kiểu nội dung, sau đó phương thức setEditorKit() sẽ được sử dụng để xác định trình soạn thảo mong muốn.

Văn bản HTML chỉ được hiển thị trong JEditorPane mà không chỉnh sửa được. Nếu JEditorPane không chỉnh sửa được thì nó sẽ hỗ trợ các sự kiện siêu liên kết. Mỗi JEditorPane có thể được thiết lập thành không chỉnh sửa được bằng cách gọi phương thức setEditable() và truyền giá trị trị false kèm theo.

Để xử lý các sự kiện siêu liên kết thì Swing cung cấp một giao diện là javax.swing.event.HyperlinkListener. JEditorPane có một phương thức là addHyperlinkListener() để tạo một đối tượng của bất kỳ lớp nào thực thi giao diện HyperlinkListener.

Giao diện HyperlinkListener có phương thức hyperlinkUpdate() và nó được gọi khi người dùng click chuột vào link trong editor pane.

Cú pháp:

public void hyperlinkUpdate(HyperlinkEvent e)

Dưới đây là những bước cần được thực hiện trong phương thức hyperlinkUpdate() để tạo liên kết tới một trang ngoài:

1. Truy xuất kiểu sự kiện và kiểm tra xem sự kiện có phải là ACTIVATED hay không

HyperlinkEventobject có một phương thức là getEventType() dùng để truy xuất kiểu của sự kiện. Kiểu của sự kiện này được đánh đồng với HyperlinkEvent.EventType.ACTIVATED.

2. Truy xuất nguồn của sự kiện

Phương thức getSource() của đối tượng HyperlinkEvent được dùng để truy xuất nguồn của sự kiện. Đối tượng được truy xuất sẽ được định kiểu thành JEditorPane.

3. Kiểm tra xem sự kiện siêu liên kết có là một thể hiện của HTMLFrameHyperlinkEvent hay không

Ta sử dụng toán tự instanceOf  để kiểm tra điều này.

4. Chuyển kiểu của sự kiện siêu liên kết thành HTMLFrameHyperlinkEvent

Nếu sự kiện siêu liên kết là một đối tượng của HTMLFrameHyperlinkEvent thì ta chuyển kiểu của nó thành HTMLFrameHyperlinkEvent.

5. Truy xuất đối tượng HTMLDocument của nguồn sự kiện

JEditorPane có một phương thức là getDocument() dùng để truy xuất đối tượng Document, và đối tượng document này được chuyển kiểu thành HTMLDocument.

6. Gọi phương processHTMLFrameHyperlinkEvent() của đối tượng document

Phương thức processHTMLFrameHyperlinkEvent() của đối tượng document được gọi và đối tượng HTMLFrameHyperlinkEvent được truyền đi dưới dạng đối số.

6. Nếu sự kiện siêu liên kết không phải là thể hiện của HTMLFrameHyperlinkEvent

Kiểm tra xem sự kiện siêu liên kết có phải là một thể hiện của HTMLFrameHyperlinkEvent hay không, nếu không phải thì có nghĩa nó là một URL.

7. Gọi phương thức setPage() trên đối tượng nguồn

Đối tượng sự kiện siêu liên kết có một phương thức là getURL() dùng để trả về một đối tượng URL, URL này được truyền tới phương thức setPage() của editor pane.

Đoạn mã sau đây minh họa cách sử dụng JEditorPane.

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.html.HTMLFrameHyperlinkEvent;
import javax.swing.text.html.HTMLDocument;

public class ReadURLFileNew extends JFrame {

    private final JTextField urlValue;
    private JEditorPane contents;

    public ReadURLFileNew() {
        super("Web Browser");
        Container conObj = getContentPane();
        urlValue = new JTextField("Enter URL here     ");
        urlValue.addActionListener((ActionEvent e) -> {
            getPages(e.getActionCommand());
        });
        conObj.add(urlValue, BorderLayout.NORTH);
        contents = new JEditorPane();
        contents.setEditable(false);
        contents.addHyperlinkListener((HyperlinkEvent e) -> {
            if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                getPages(e.
                        getURL().toString());
            } else {
            }
            if (e instanceof HTMLFrameHyperlinkEvent) {

                HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent) e;

                HTMLDocument doc = (HTMLDocument) contents.getDocument();

                doc.processHTMLFrameHyperlinkEvent(evt);
            } else {
                try {
                    contents.setPage(e.getURL());
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
        conObj.add(new JScrollPane(contents), BorderLayout.CENTER);
        setSize(400, 300);
        setVisible(true);
    }

    private void getPages(String location) {
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        try {
            contents.setPage(location);
            urlValue.setText(location);
        } catch (IOException io) {

            JOptionPane.showMessageDialog(this, "Error retrieving data from the specified URL site", "Check URL", JOptionPane.ERROR_MESSAGE);
        }
        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }

    public static void main(String args[]) {

        ReadURLFileNew urlObj = new ReadURLFileNew();

        urlObj.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        }
        );
    }
}

Dưới đây là hình ảnh thể hiện kết quả của đoạn mã trên:

http://v1study.com/public/images/article/java-swing-jeditorpane-example.png

» Tiếp: Cách sử dụng nhãn (Label)
« Trước: Cách tạo hộp thoại (Dialog)
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 !!!