在java中突出显示文本

Posted

技术标签:

【中文标题】在java中突出显示文本【英文标题】:Highlighting Text in java 【发布时间】:2011-09-25 16:25:43 【问题描述】:

我们正在开发一个抄袭检测框架。在那里,我必须强调文档中可能存在的抄袭短语。文档首先通过停用词删除、词干提取和数字删除进行预处理。因此,使用预处理的令牌突出显示变得困难 举个例子:

原始文本:“极限编程是敏捷软件开发的一种方法,它强调在称为时间盒的短开发周期中频繁发布。这通过多个短开发周期而不是一个长的。极限编程包括结对编程(用于代码审查,单元测试)。它还避免实现当前时间框不包含的功能,因此可以最大限度地减少进度蠕变。 "

短语要强调:极限编程包括成对编程

预处理令牌:Extrem program pair-wise program

无论如何我可以在原始文档中突出显示预处理的令牌????

感谢

【问题讨论】:

@Nuwan 您对***.com/questions/6360017/… 不满意吗,那么您接受的比率就是原因:-) ...添加 swing 和 jtextarea 标签的原因是什么? @Andreas_D Nuwan 在他的程序中使用了 JTextArea。虽然,他在这个问题上并没有指出这一点。查看他的其他问题。 不清楚你想得到什么最终结果。请添加修改后的原始文本,其中包含您要突出显示的单词,格式为 bold @MackerTim:我已经突出显示了文本(以粗体显示)..thanx :) 【参考方案1】:

您最好使用JTextPane 或JEditorPane,而不是JTextArea。

文本区域是一个“纯”文本组件,这意味着虽然它可以以任何字体显示文本,但所有文本都使用相同的字体。

因此,JTextArea 不是一个方便的组件来进行任何文本格式设置。

相反,使用JTextPaneJEditorPane,很容易改变加载文本任何部分的样式(高亮)。

详情请见How to Use Editor Panes and Text Panes。

更新:

以下代码突出显示文本的所需部分。 这不是你想要的。它只是在文本中找到确切的短语。

但我希望如果你应用你的算法,你可以轻松地 修改它以满足您的需要。

import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;

public class LineHighlightPainter 

    String revisedText = "Extreme programming is one approach "
            + "of agile software development which emphasizes on frequent"
            + " releases in short development cycles which are called "
            + "time boxes. This result in reducing the costs spend for "
            + "changes, by having multiple short development cycles, "
            + "rather than one long one. Extreme programming includes "
            + "pair-wise programming (for code review, unit testing). "
            + "Also it avoids implementing features which are not included "
            + "in the current time box, so the schedule creep can be minimized. ";
    String token = "Extreme programming includes pair-wise programming";

    public static void main(String args[]) 
        try 
            SwingUtilities.invokeAndWait(new Runnable() 

                public void run() 
                    new LineHighlightPainter().createAndShowGUI();
                
            );
         catch (InterruptedException ex) 
            // ignore
         catch (InvocationTargetException ex) 
            // ignore
        
    

    public void createAndShowGUI() 
        JFrame frame = new JFrame("LineHighlightPainter demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextArea area = new JTextArea(9, 45);
        area.setLineWrap(true);
        area.setWrapStyleWord(true);
        area.setText(revisedText);

        // Highlighting part of the text in the instance of JTextArea
        // based on token.
        highlight(area, token);

        frame.getContentPane().add(new JScrollPane(area), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    

    // Creates highlights around all occurrences of pattern in textComp
    public void highlight(JTextComponent textComp, String pattern) 
        // First remove all old highlights
        removeHighlights(textComp);

        try 
            Highlighter hilite = textComp.getHighlighter();
            Document doc = textComp.getDocument();
            String text = doc.getText(0, doc.getLength());

            int pos = 0;
            // Search for pattern
            while ((pos = text.indexOf(pattern, pos)) >= 0) 
                // Create highlighter using private painter and apply around pattern
                hilite.addHighlight(pos, pos + pattern.length(), myHighlightPainter);
                pos += pattern.length();
            

         catch (BadLocationException e) 
        
    

    // Removes only our private highlights
    public void removeHighlights(JTextComponent textComp) 
        Highlighter hilite = textComp.getHighlighter();
        Highlighter.Highlight[] hilites = hilite.getHighlights();

        for (int i = 0; i < hilites.length; i++) 
            if (hilites[i].getPainter() instanceof MyHighlightPainter) 
                hilite.removeHighlight(hilites[i]);
            
        
    
    // An instance of the private subclass of the default highlight painter
    Highlighter.HighlightPainter myHighlightPainter = new MyHighlightPainter(Color.red);

    // A private subclass of the default highlight painter
    class MyHighlightPainter
            extends DefaultHighlighter.DefaultHighlightPainter 

        public MyHighlightPainter(Color color) 
            super(color);
        
    

此示例基于Highlighting Words in a JTextComponent。

【讨论】:

【参考方案2】:

从技术角度来看:您可以选择或开发一种标记语言,并为原始文档添加注释或标签。或者您想创建一个记录所有潜在抄袭的第二个文件。

使用标记,您的文本可能如下所示:

[...] rather than one long one. <plag ref="1234">Extreme programming 
includes pair-wise programming</plag> (for code review, unit testing). [...]

ref 引用了一些描述原始数据的元数据记录)

【讨论】:

【参考方案3】:

您可以使用 java.text.AttributedString 来注释原始文档中的预处理标记。 然后将TextAttributes应用到相关的(在原始文档中生效。

【讨论】:

以上是关于在java中突出显示文本的主要内容,如果未能解决你的问题,请参考以下文章

在 Eclipse 中突出显示文本文件中的相同单词

突出显示 JTextArea 中的特定文本 - Java

如何更改 Java Swing TextArea 中的突出显示颜色?此外,更改与突出显示位置对应的文本的开头

如何在文本突出显示期间保留语法突出显示

Rmarkdown 文本突出显示未显示在 PDF 输出中

iTextSharp PDF 使用 C# 读取突出显示的文本(突出显示注释)