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

时间:2012-06-15 14:51:26

标签: swing jtextarea

我有一个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”的索引。有人可以帮我解决这个想法/建议吗?谢谢!

1 个答案:

答案 0 :(得分:2)

你几乎所有人都有这个问题但是很少。

  1. 您应该使用getSelectionStart()而不是getCaretPosition()
  2. 精彩集锦应从index开始,而不是从index-1开始。
  3. 请参阅下面的示例。选择要突出显示的内容右键单击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) {
                }
            }
        }
    }