2

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

4

1 回答 1

2

您几乎自己拥有它,但几乎没有问题。

  1. 您应该使用getSelectionStart()而不是getCaretPosition().
  2. 亮点应该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) {
            }
        }
    }
}
于 2012-06-15T15:38:26.650 回答