在JEditorPane中实现动态文本样式

时间:2009-09-28 20:39:23

标签: java swing text text-editor

我有一个想法,用Java编写一个笔记记录应用程序,在您键入时执行一些简单的文本替换;可能是Markdown语法的一小部分。因此,例如,如果您输入了一行#sometext,它将被渲染:

sometext

Wikidpad是我正在尝试做的事情的一部分(我不只是重新实现它,只是部分语法/显示功能)。

所以基本上我正在寻找一种方法来编写某种组件,当用户点击时 “返回”,它将查看输入的行,并做任何需要做的魔法才能使html标记正确。

我一直在反对Documents and DocumentFilters和DocumentListeners以及HTMLReaders,而且没有多少运气,任何人都可以把我放在正确的道路上吗?

5 个答案:

答案 0 :(得分:3)

您感兴趣的是java text editor kit。本教程非常棒,帮助我实现了一个类似于您的问题的wiki编辑器。 swing编辑器套件(信不信由你)是专为解决您的问题而设计的。我已经编写了一个动态wiki,比如使用这种技术链接系统,尽管并非没有太多的挣扎。这就是我必须做的事情:

  1. 制作文档 第一项任务是创建一个文档模型,在标识文本时标记模式。如果查看链接示例中的JavaDocument,则会进行insertUpdate调用。在文档中,您可以找到所需的模式,并使用适当的自定义样式替换它。基本上,您只需创建一个样式并将其应用于匹配模式的文档。更新方法的替代方法是使用私有工作线程来定期扫描新的wiki内容。

  2. 构建渲染上下文模型完成后,您可以实现构建适合渲染新文本的视图的上下文。在链接的示例中,它们扩展了StyleContext。这是用于将文本呈现给视图的内容。在这里,您可以设置可以找到特定标记的渲染规则,并执行下划线并删除方括号等内容。

  3. 制作编辑工具包这会将所有内容拼接在一起并确定文档的内容类型。

  4. 将文档和视图保持为单独的上下文的好处是,您可以将文档附加到两个视图,一个是纯文本,另一个是新自定义上下文。由于默认样式无法识别您的标记,因此它应以原始维基代码形式显示。新视图会将视图转换为适当的链接。

    我希望这会有所帮助。需要注意的是,即使是挥杆,这些东西也很复杂。祝你好运!

答案 1 :(得分:1)

您需要做的就是在编辑器组件中实现某种键侦听器,在它们进入文本字段之前检查键击。然后,它可以在缓冲区中搜索,找到您的控制字符并执行它需要做的事情。

我对JEditorPanes等没有太多经验。但我认为你可以像其他任何swing组件一样为它们添加关键的监听器。

基本上我不认为存在这样的组件,因此您基本上需要实现自己的组件。

我可能错了。

答案 2 :(得分:0)

当他们点击输入时,或者只是在他们提交数据时是否必须发生?

如果正在提交,请等待他们按下一个保存数据的按钮,然后执行JEditorPane.getText(),“修复”文本,然后执行JEditorPane.setText(text);

好的,如果它应该在运行中,请尝试添加输入法侦听器。 InputMethodEvent应该能够调用“getText()”,并且你应该能够在每次按键后解析它。如果你想在每次用户点击进入后进行操作,请在每次按键时获取文本,然后查看文本中的当前位置是否是\ n之后的一个字符或类似字符。

答案 3 :(得分: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);

答案 4 :(得分:0)

使用RSyntaxTextArea,它可以满足您的需求,您可以添加自己的词法分析器/规则。