2009-09-28 71 views
5

我有一個想法,用Java編寫一個筆記應用程序,它可以在您鍵入時進行一些簡單的文本替換;可能是Markdown語法的一小部分。因此,舉例來說,如果你進入了一個線,這是#sometext,它會得到渲染:在JEditorPane中實現即時文本樣式

sometext

Wikidpad是我想要做的(我不只是重新實現的那部分,只是語法/顯示功能的一部分)。

所以基本上我正在尋找一種方式來編寫某種組件,當用戶點擊 「return」時,它會查看輸入的行並執行任何需要獲取html標籤的魔法對。

我一直在打擊我的頭對Document和DocumentFilters和DocumentListeners和HTMLReaders等,沒有多少運氣,任何人都可以把我放在正確的道路上?

回答

3

你感興趣的是java text editor kit。本教程非常棒,幫助我實現了一個類似於您的問題的維基編輯器。揮杆編輯器套件(信不信由你)專門設計來處理你的問題。我寫了一個像使用這種技術來鏈接系統的動態wiki,儘管不是沒有很多的困難。這是我必須做的:

  1. 將文檔 的第一個任務是創建一個文檔模型,當它識別文本標記圖案。如果您查看鏈接示例中的JavaDocument,則會看到一個insertUpdate調用。在文檔中,您可以找到您正在查找的圖案,並將其替換爲適合的自定義樣式。基本上,您只需創建一個樣式並將其應用於匹配模式的文檔。更新方法的替代方法是使其使用私有工作者線程來定期掃描新的wiki內容。

  2. 構建渲染上下文模型完成後,您可以實現構建適合渲染新文本的視圖的上下文。在鏈接的例子中,它們擴展了一個StyleContext。這是用來將文本呈現給視圖的東西。在這裏,您可以設置渲染規則,以找到您的特定標記並執行類似下劃線和刪除方括號的內容。

  3. 製作一個編輯器套件這將把所有內容縫合在一起併爲文檔標識內容類型。

關於保持記錄並瀏覽作爲獨立的環境中的好處是您可以將文檔附加到兩種觀點,一個以純文本格式,另外在新的自定義背景。由於默認樣式不能識別您的標籤,因此應該以原始wiki代碼形式顯示它。新觀點將把觀點轉化爲適當的聯繫。

我希望這會有所幫助。謹慎的一句話,這個東西不幸的是很複雜,即使是揮杆。祝你好運!

+0

是的,這就是我一直在領導的地方 - 但我還沒有碰到那個教程。這個過程非常複雜,但我認爲這個頁面會有很大的幫助。 – decitrig 2009-10-08 11:45:06

+0

我明白你的失望。文本編輯器可以使用一些代碼可用性重構 – reccles 2009-10-10 18:12:38

+0

與幾乎所有的Oracle一樣,該鏈接被破壞。任何線索現在在哪裏可以找到這個教程? – 2014-03-19 15:31:41

1

聽起來像你需要做的是在你的編輯器組件中實現某種按鍵偵聽器,它在輸入文本字段之前檢查按鍵。然後它可以搜索緩衝區,找到你的控制字符並做它需要做的事情。

我對JEditorPanes等沒有太多的經驗。但我認爲你可以將關鍵聽衆添加到他們,就像任何其他揮杆組件。

基本上我不認爲有這樣的組件存在,所以你基本上需要實現自己的。

雖然我可能是錯的。

+0

是的,我玩過關鍵字,但他們似乎並沒有消耗關鍵事件,所以在窗格已經將角色粘在其內容之前,我不能「做我該做的事情」。 – decitrig 2009-10-06 12:58:16

0

當它們碰到回車或者它們提交數據時是否發生?

如果它正在提交,請等待它們按下一個可以保存數據的按鈕,然後執行JEditorPane.getText(),「修復」文本,並執行JEditorPane.setText(text);

好的,如果它應該在運行中,請嘗試添加一個輸入方法偵聽器。 InputMethodEvent應該能夠調用「getText()」,你應該能夠在每次按鍵之後解析它。如果您想在每次用戶點擊輸入後執行此操作,請在每次按鍵上獲取文本,並查看文本中的當前位置是\ n還是類似的一個字符。

+0

我想在飛行中做到這一點。 – decitrig 2009-10-05 17:48:20

0

起初我建議使用JTextPane,因爲這樣更適合將樣式應用到文本。然後,添加keyPressed事件非常容易:

jTextPane1.addKeyListener(new java.awt.event.KeyAdapter() { 
    public void keyPressed(java.awt.event.KeyEvent evt) { 
     jTextPane1KeyPressed(evt); 
    } 
}); 

private void jTextPane1KeyPressed(java.awt.event.KeyEvent evt) { 
    // TODO add your handling code here: 
    String txt = jTextPane1.getText(); 

} 

上面的代碼很容易用Netbeans生成。

然後,您可以將樣式做這樣的事情:

StyledDocument doc = jTextPane1.getStyledDocument(); 
Style style = jTextPane1.addStyle("Bold", null); 
StyleConstants.setBold(style, true); 

int pos, endpos; 
// Find pos of word to be displayed in bold 
... 

// Set style 
doc.setCharacterAttributes(pos, endpos, style, true); 
+0

我也想過這個;我擔心的是它不會隨着大型文檔的擴展,因爲每次按下按鍵時都會讀取整個文本和重新整理。 – decitrig 2009-10-08 11:40:32

+0

您可以使用evt.getKeyChar()並僅在需要時纔讀取整個文本。第一次按'#'時設置一個標誌,然後讀取文本並在空格/新行被按下時應用格式。您還應該滿足用戶將文本粘貼到控件中的情況。您可以監視這些事件的元字符。 – kgiannakakis 2009-10-08 13:03:36

0

使用RSyntaxTextArea,它確實你需要什麼,你可以添加自己的詞法/規則。

+0

我一定會檢查出來。 – decitrig 2009-10-08 11:45:40