在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
不是一个方便的组件来进行任何文本格式设置。
相反,使用JTextPane
或JEditorPane
,很容易改变加载文本任何部分的样式(高亮)。
详情请见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中突出显示文本的主要内容,如果未能解决你的问题,请参考以下文章