2012-10-28 24 views
1

我有一個JTable,它使用JTextPane作爲編輯器和渲染器。我在編輯器中添加了一個keyListener,它偵聽「空格」字符並檢查最後一個單詞是否爲URL,如果是,則使用以下屬性將其作爲超鏈接添加到編輯器中:attrs.addAttribute(HTML.Attribute.HREF, url);。我很快意識到,當我粘貼文本時,這不會將URL轉換爲超鏈接,因此我決定使用DocumentFilter來執行此操作。如何實現將URL作爲超鏈接插入到JTextPane中的DocumentFilter?

如何創建一個DocumentFilter來檢查要插入/替換的文本是否包含URL,並確實插入/替換了帶有HTML.Attribute.HREF屬性和其餘文本的thoose URL?

回答

-1
// somewhere add text reformated as html link 
setText("<HTML>Click the <FONT color=\"#000099\"><U>link</U></FONT>" 
     + " to go to the Java website.</HTML>"); 

// somewhere add a listener for clicks 
addActionListener(new OpenUrlAction()); 

// Define uri and open action 
final URI uri = new URI("http://java.sun.com"); 
    class OpenUrlAction implements ActionListener { 
     @Override public void actionPerformed(ActionEvent e) { 
     open(uri); 
     } 
    } 

// Define open uri method 
private static void open(URI uri) { 
    if (Desktop.isDesktopSupported()) { 
     try { 
     Desktop.getDesktop().browse(uri); 
     } catch (IOException e) { /* TODO: error handling */ } 
    } else { /* TODO: error handling */ } 
+0

我不知道如果我可以讓我的問題更清楚,但我需要創建一個'DocumentListener'。打開鏈接並將默認光標轉換爲手形光標的其他部分已完成。請刪除這個答案,因爲它不適合我的問題。 – Igor

+0

那你爲什麼不使用HTMLEditorKit那裏還有HTMLEditorKit.LinkController類存在。 –

+0

這是一個鼠標監聽器,用於監聽鼠標點擊已添加的超鏈接。我想讓應用在您輸入時將網址轉換爲超鏈接。 – Igor

1

見的例子http://java-sl.com/tip_autocreate_links.html 這是沒有必要使用某個DocumentFilter。 LIstener就夠了。

只需用虛擬屬性標記插入的內容,然後將其替換爲超鏈接html。

+0

我已經有了類似於此的東西,它會偵聽「」和「\ n」,但如果您粘貼文本,則這不起作用,這就是爲什麼我需要documentfilter。 – Igor

+0

實現一種單一方法來檢查2個偏移之間的文本範圍。當您粘貼文本DocumentListener也被調用(可能會多次)。將事件的偏移量傳遞給方法並處理更改後的片段。 – StanislavL

+1

嗯..有趣。雖然:在修改DocumentListener中的通知文檔時,我們不期望出現問題嗎?就像一般規則一樣:永遠不要在回調方法中改變調用者的狀態。總是認爲DocumentFilter是(僅)安全的方式... – kleopatra