Как я могу динамически изменить цвет шрифта в JTextArea?

Я пишу скрипт для редактора кода и мне нужны динамические команды.

Итак, если пользователь наберет «класс», он изменит цвет «класса».

Как мне это сделать?

// This is the main focus part of the code.

textarea.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent evt) {
            word += evt.getKeyChar();

            if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
                word = "";
                line = "";
                lineInMemory = line;
            }

            if(evt.getKeyCode() == KeyEvent.VK_SPACE) {
                word = word.replaceAll("null","");
                line += word;
                word = "";
                String text = textarea.getText();
                String[] words = line.split(" ");

                if(word.toLowerCase().equals("class")) {

                    // What the heck do I put here?!

                }       
            }
         }
    });

У меня уже есть ключевые слушатели, которые читают ключи, складывают их в слова, а затем слова складываются в предложения. Я хотел бы, чтобы они вводили ключевое слово, и оно автоматически меняло цвет ключевого слова, пока они все еще печатают, немного похоже на то, что делает Sublime Text.


person mgthomas99    schedule 29.08.2014    source источник
comment
Добро пожаловать в StackOverflow, мы не фабрика кода, как вы могли заметить. Вы должны опубликовать свой код или хотя бы минимальный пример, чтобы мы могли скопировать и вставить его и помочь вам. Если вы не приложите никаких усилий, чтобы решить ее самостоятельно, то я не думаю, что кто-то попытается помочь вам в этом.   -  person Frakcool    schedule 29.08.2014
comment
Да, я редактировал статью, когда вы ее опубликовали. Спасибо!   -  person mgthomas99    schedule 29.08.2014


Ответы (1)


JTextArea предназначен только для простого текста и не может окрашивать определенные слова. Если вы хотите иметь возможность раскрашивать разные слова, вам нужно использовать JTextPane или JEditorPane .

Для получения дополнительной информации см. этот вопрос. Этот вопрос также может быть полезен (особенно второй ответ).

Вот пример:

JTextPane textPane = new JTextPane();
StyledDocument doc = textPane.getStyledDocument();

Style style = textPane.addStyle("Style", null);
StyleConstants.setForeground(style, Color.red);
String word = "Hello";

if (word.equals("Hello")) {
    try {
        doc.insertString(doc.getLength(), word, style);
    } catch (BadLocationException ex) {
        ex.printStackTrace();
    }
} else {
    StyleConstants.setForeground(style, Color.blue);

    try {
        doc.insertString(doc.getLength(), word, style);
    } catch (BadLocationException e) {
        e.printStackTrace();
    }
}

Это делает строку word. Если слово "Hello", оно будет отображаться красным цветом, в противном случае — синим.

person Zach    schedule 29.08.2014
comment
Спасибо за это, но, похоже, выдает ошибку. Ошибка появляется в строке 5 отправленного вами кода, где написано StyleConstants.setForeground(style, Color.red); и я не уверен, почему. Я, вероятно, упускаю что-то очевидное, но я относительно новичок в программировании с графическим интерфейсом. Какие-либо предложения? - person mgthomas99; 29.08.2014
comment
Исключение в потоке main java.lang.Error: нерешенные проблемы компиляции: синтаксическая ошибка в токене (ах), неуместная конструкция (ы) синтаксическая ошибка в токене (удалить этот токен Синтаксическая ошибка в токене), недопустимый VariableDeclarator - person mgthomas99; 29.08.2014
comment
Итак, я нашел одну ошибку: в строке if (word.equals("Hello")*)* пропущено ). Я исправил это сейчас, но я не получаю никаких других ошибок. Убедитесь, что все ваши импорты верны. - person Zach; 29.08.2014
comment
Вы должны взглянуть на второй ответ здесь: stackoverflow.com/questions/14400946/ Вероятно, это то, что вы пытаетесь сделать. - person Zach; 29.08.2014