Подсветка для программиста, но не для пользователя

Я делаю программу, в которой мне нужно иметь возможность редактировать функцию выделения JTextArea с помощью моего кода, но я не хочу, чтобы пользователь мог выделять с помощью мыши. Это, или мне нужен какой-то способ закрасить JTextArea вручную (чтобы выглядело как выделение).

На самом деле у меня пока нет для этого кода, потому что я понятия не имею, как это реализовать.

Редактировать: я знаю, как закрасить текст, но мне нужно, чтобы рисунок был прозрачным, как выделение.


person Collin Shoop    schedule 18.03.2013    source источник
comment
также см. Выделить одну конкретную строку/строку в JTextArea   -  person tenorsax    schedule 19.03.2013


Ответы (3)


Вы можете начать с этого кода. Он находит слово, заданное пользователем в String findstr, и выделяет это слово во всей текстовой области. Вы можете использовать его для поиска и выделения определенного слова несколько раз в текстовой области, пока оно не достигнет конца содержимого текстовой области.

String findstr = findTextField.getText().toUpperCase(); // User Input Word to find
int findstrLength = findstr.length();                   
String findtextarea = textarea.getText().toUpperCase(); // TextArea Content
Highlighter h = textarea.getHighlighter();
h.removeAllHighlights();
try
    {
        int index=0;
         while(index>=0) {
        index = findtextarea.indexOf(findstr,index);
        if (index > 0) {
           h.addHighlight(index,index+findstrLength, DefaultHighlighter.DefaultPainter);
        }
        index++; // try adding this to allow you to look for the next index.
    }
    }
person Sharad Tank    schedule 18.03.2013

Я не хочу, чтобы пользователь мог выделить с помощью мыши

Это называется "отбор". Вы можете отключить это для текстового компонента с помощью пользовательского курсора:

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class NoTextSelectionCaret extends DefaultCaret
{
    public NoTextSelectionCaret(JTextComponent textComponent)
    {
        setBlinkRate( textComponent.getCaret().getBlinkRate() );
        textComponent.setHighlighter( null );
    }

    @Override
    public int getMark()
    {
        return getDot();
    }

    private static void createAndShowUI()
    {
        JTextField textField1 = new JTextField("No Text Selection Allowed");
        textField1.setCaret( new NoTextSelectionCaret( textField1 ) );
        textField1.setEditable(false);

        JTextField textField2 = new JTextField("Text Selection Allowed");

        JFrame frame = new JFrame("No Text Selection Caret");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(textField1, BorderLayout.NORTH);
        frame.add(textField2, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
person camickr    schedule 18.03.2013

См. интерфейс Highlighter.HighlightPainter, что легко (сомнительно) позволяет изменить внешний вид подсветки.

Есть несколько конкретных реализаций, но вы можете определить свои собственные.

person Mordechai    schedule 18.03.2013