在 JTextArea 中突出显示选定的行
Highlighting a selected line in JTextArea
我一直在寻找一种方法来突出显示 JTextArea 中的选定行。关于如何在 JTextArea 中突出显示文本,有很多 post,但它只涉及到字母。我希望能够突出显示整行(就像 Eclipse 编辑器在您单击一行时突出显示您所在的整个当前行一样)。我发现的所有 post 都建议使用 Highlighter 对象,但我不确定这是否会突出显示 JTextArea 的非字符区域。另外,有没有办法找到 JTextArea 中选定的行是什么?不是有多少行,而是选定的行(比如有人点击返回到较早的点)。还是计算过程很复杂?
您需要关闭分层高光:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
JTextArea textArea = new JTextArea(4, 30);
textArea.setText("one\ntwo\nthree");
add( new JScrollPane(textArea) );
DefaultHighlighter highlighter = (DefaultHighlighter)textArea.getHighlighter();
DefaultHighlighter.DefaultHighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter( Color.RED );
highlighter.setDrawsLayeredHighlights(false); // this is the key line
try
{
int start = textArea.getLineStartOffset(1);
int end = textArea.getLineEndOffset(1);
highlighter.addHighlight(start, end, painter );
}
catch(Exception e)
{
System.out.println(e);
}
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new SSCCE());
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater( () -> createAndShowGUI() );
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
您可能还想查看 Line Painter class,它会在插入符号移动时突出显示当前行。所以这个 class 将管理亮点。也就是说,当插入符从一行移动到另一行时,先前的突出显示被删除并添加了新的突出显示。
我一直在寻找一种方法来突出显示 JTextArea 中的选定行。关于如何在 JTextArea 中突出显示文本,有很多 post,但它只涉及到字母。我希望能够突出显示整行(就像 Eclipse 编辑器在您单击一行时突出显示您所在的整个当前行一样)。我发现的所有 post 都建议使用 Highlighter 对象,但我不确定这是否会突出显示 JTextArea 的非字符区域。另外,有没有办法找到 JTextArea 中选定的行是什么?不是有多少行,而是选定的行(比如有人点击返回到较早的点)。还是计算过程很复杂?
您需要关闭分层高光:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
JTextArea textArea = new JTextArea(4, 30);
textArea.setText("one\ntwo\nthree");
add( new JScrollPane(textArea) );
DefaultHighlighter highlighter = (DefaultHighlighter)textArea.getHighlighter();
DefaultHighlighter.DefaultHighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter( Color.RED );
highlighter.setDrawsLayeredHighlights(false); // this is the key line
try
{
int start = textArea.getLineStartOffset(1);
int end = textArea.getLineEndOffset(1);
highlighter.addHighlight(start, end, painter );
}
catch(Exception e)
{
System.out.println(e);
}
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new SSCCE());
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater( () -> createAndShowGUI() );
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
您可能还想查看 Line Painter class,它会在插入符号移动时突出显示当前行。所以这个 class 将管理亮点。也就是说,当插入符从一行移动到另一行时,先前的突出显示被删除并添加了新的突出显示。