Swing 在存在重复行的情况下突出显示JTextArea中的文本

Swing 在存在重复行的情况下突出显示JTextArea中的文本,swing,jtextarea,Swing,Jtextarea,我有一个JTextArea,它由行组成(其中一些行可能相互重复)。我有一个要求,我必须在右键单击时高亮显示所选行。我用来突出显示的代码如下: String highlightedText = textArea.getSelectedText(); if(highlightedText != null) { try{ int index = textArea.getText().indexOf(highlightedText, textArea.getCaretPosition(

我有一个
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
中交
DDDD
AAAA


当用户试图突出显示这一行时,我无法获得第二个“AAAA”的索引。有人能帮我提出一个解决这个问题的想法/建议吗?谢谢

你几乎全靠自己,但问题很少

  • 您应该使用
    getSelectionStart()
    而不是
    getCaretPosition()
  • 突出显示应该从
    index
    开始,而不是从
    index-1
    开始
  • 请参见下面的示例。选择要突出显示的内容右键单击文本区域或按按钮突出显示所选内容:

    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) {
                }
            }
        }
    }
    

    你应该瞄准的是。使用上述两种方法后,请尝试此方法(滚动到第二个示例)。尝试此示例,它类似于您使用
    viewToModel()
    的情况。您可以获得偏移值,如上面的链接所示,它可以使用此方法为您提供行号。虽然这个问题问得很好,但我想提高投票率,但我今天的投票上限已经没有了,所以我会在八小时内做到:-)太好了!这个对我帮助很大!我不知道我为什么写索引-1:(……非常感谢你的帮助!!