我有一个JTextArea
由行组成(其中一些可能是彼此重复的)。我有一个要求,我要在右键单击时突出显示所选行。我用来强调的代码如下:
String highlightedText = textArea.getSelectedText();
if(highlightedText != null)
{
try{
int index = textArea.getText().indexOf(highlightedText, textArea.getCaretPosition());
textArea.getHighlighter().addHighlight(index - 1, index + highlightedText.length(),
new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE));
}catch (BadLocationException ex) {
}
}
虽然右键单击时突出显示,但问题是我无法在存在重复项的情况下获取所选行的索引。所以,如果有像
这样的行 AAAA
BBBB
AAAA
CCCC
DDDD
AAAA
当用户试图突出显示此特定行时,我无法获取第二个“AAAA”的索引。有人可以帮我解决这个想法/建议吗?谢谢!
答案 0 :(得分:2)
你几乎所有人都有这个问题但是很少。
getSelectionStart()
而不是getCaretPosition()
。index
开始,而不是从index-1
开始。请参阅下面的示例。选择要突出显示的内容右键单击textArea或按按钮突出显示您的选择:
public class HighlightingTextArea {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JTextArea textArea = new JTextArea(10, 44);
textArea.append("AAAA\nBBBB\nAAAA\nCCCC\nDDDD\nAAAA");
JButton b = new JButton(new AbstractAction("highlight") {
@Override
public void actionPerformed(ActionEvent e) {
highlightTextAreaSelection(textArea);
}
});
textArea.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
if (e.getButton() == MouseEvent.BUTTON3) {
highlightTextAreaSelection(textArea);
}
}
});
JPanel panel = new JPanel(new BorderLayout());
panel.add(textArea);
panel.add(b, BorderLayout.SOUTH);
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(panel);
f.pack();
f.setVisible(true);
}
});
}
private static void highlightTextAreaSelection(JTextArea textArea) {
String highlightedText = textArea.getSelectedText();
if (highlightedText != null) {
try {
int index = textArea.getText().indexOf(highlightedText, textArea.getSelectionStart());
textArea.getHighlighter().addHighlight(index, index + highlightedText.length(),
new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE));
} catch (BadLocationException ex) {
}
}
}
}