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

右クリック時の強調表示は機能しますが、重複があると選択した行のインデックスを取得できないという問題があります。したがって、次のような行がある場合

あぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ
_
_
_
_
_

ユーザーがこの特定の行を強調表示しようとすると、2 番目の「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 に答える