изменить шрифт определенных строк в JTextArea

Привет, я работаю над приложением для чата, и я хочу, чтобы пользователь мог изменить шрифт, который он/она пишет. есть функция setFont(), но она меняет шрифт всех строк в TextArea. поэтому я просто хочу изменить только свой шрифт. Я ценю, если вы можете мне помочь.


person quartaela    schedule 06.09.2011    source источник
comment
возможный дубликат Как изменить цвет текста в JtextArea?   -  person Suma    schedule 08.01.2015


Ответы (4)


ну тогда я думаю, я должен выучить немного HTML

Я бы не стал использовать HTML. Мне проще просто использовать атрибуты при работе с текстовой панелью. Атрибуты гораздо проще изменить, чем пытаться манипулировать HTML.

SimpleAttributeSet green = new SimpleAttributeSet();
StyleConstants.setFontFamily(green, "Courier New Italic");
StyleConstants.setForeground(green, Color.GREEN);

//  Add some text

try
{
    textPane.getDocument().insertString(0, "green text with Courier font", green);
}
catch(Exception e) {}
person camickr    schedule 06.09.2011
comment
хач... не дочитал ответы до конца :-) +1 за соответствие моим ожиданиям - person kleopatra; 07.09.2011
comment
да, мне наконец удалось понять и использовать ваш код, но я думаю, что я должен подсчитать все символы, чтобы вставить строку в конце. :) - person quartaela; 07.09.2011
comment
@ user743898, чтобы вставить в конце, используйте textPane.getDocument().getLength(). - person camickr; 07.09.2011

Вы должны работать с JTextPane. JTextPane позволяет вам использовать HTML. Посмотрите следующий пример:

this.text_panel = new JTextPane();
this.text_panel.setContentType("text/html");
this.text_panel.setEditable(false);
this.text_panel.setBackground(this.text_background_color);
this.text_panel_html_kit = new HTMLEditorKit();
this.text_panel.setEditorKit(text_panel_html_kit);
this.text_panel.setDocument(new HTMLDocument());

Здесь вы включаете HTMLEditorKit, что позволит вам использовать HTML в вашей TextPane. Вот еще один фрагмент кода, где вы можете добавить цветной текст на панель:

public void append(String line){
    SimpleDateFormat date_format = new SimpleDateFormat("HH:mm:ss");
    Date date = new Date();

    line = "<div><font size=3 color=GRAY>[" + date_format.format(date) + "]</font><font size=3 color=BLACK>"+ line + "</font></div>";

    try {
        this.text_panel_html_kit.insertHTML((HTMLDocument) this.text_panel.getDocument(), this.text_panel.getDocument().getLength(), line, 0, 0, null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}


Надеюсь, это поможет,
Сергей.

person Serhiy    schedule 06.09.2011
comment
хорошо, тогда я думаю, я должен выучить немного HTML :). и этот код полезен для меня. Спасибо друг. - person quartaela; 06.09.2011

Вы не можете сделать это с JTextArea, но вы можете сделать это с его более красивым родственником, JTextPane. К сожалению, это не тривиально; вы можете узнать об этом классе здесь.

person Ernest Friedman-Hill    schedule 06.09.2011
comment
я думаю, я должен использовать TextPane с HTML: D - person quartaela; 06.09.2011

Различные компоненты Swing будут отображать базовый HTML (версия 3.2), включая JLabel и JEditorPane. Дополнительные сведения см. в разделе Как использовать HTML в компонентах Swing в Учебник по Java.

Вот простой пример использования последнего.

Шрифты, отображаемые в HTML

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

class ShowFonts {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GraphicsEnvironment ge = GraphicsEnvironment.
                    getLocalGraphicsEnvironment();
                        String[] fonts = ge.getAvailableFontFamilyNames();
                String pre = "<html><body style='font-size: 20px;'><ul>";
                StringBuilder sb = new StringBuilder(pre);
                for (String font : fonts) {
                    sb.append("<li style='font-family: ");
                    sb.append(font);
                    sb.append("'>");
                    sb.append(font);
                }
                JEditorPane ep = new JEditorPane();
                ep.setContentType("text/html");
                ep.setText(sb.toString());


                JScrollPane sp = new JScrollPane(ep);
                Dimension d = ep.getPreferredSize();
                sp.setPreferredSize(new Dimension(d.width,200));

                JOptionPane.showMessageDialog(null, sp);
            }
        });
    }
}
person Andrew Thompson    schedule 06.09.2011
comment
Я схожу с ума от твоего JOptionPane +1 - person mKorbel; 06.09.2011
comment
@mKorbel На самом деле это лень - на несколько строк короче, чем создание JFrame. ;) - person Andrew Thompson; 06.09.2011
comment
ну это несколько сложно для меня :D. но я надеюсь, что я научусь этому уроку :) - person quartaela; 07.09.2011
comment
цена, которую нужно заплатить, - это зло setPreferredSize ;-) - person kleopatra; 07.09.2011
comment
(пожимает плечами) Я достаточно уверен, что любое решение, включающее JTextPane, в какой-то момент также должно будет вызвать setPreferredSize(). Не стесняйтесь доказывать, что я ошибаюсь. - person Andrew Thompson; 07.09.2011
comment
не с достаточно мощным LayoutManager :-) Но это другая история - я хотел придраться здесь к тому, что ярлык с optionPane (который я люблю, кстати) перемещает жестко запрограммированные размеры из контейнера верхнего уровня вниз в ребенок - person kleopatra; 07.09.2011
comment
любопытно (и вернемся к проблеме): почему вы все рекомендуете html? Разве требование OP не является чистым случаем для некоторых пользовательских стилей в текстовой панели? - person kleopatra; 07.09.2011
comment
@kleopatra Хорошо, я уступлю последний пункт. Только после внимательного перечитывания вопроса ОП мне пришло в голову, что маршрут HTML/JEP не особенно хорош для постоянно меняющегося текста, что, я думаю, подразумевает вопрос. JTextPane — отличный выбор для этого варианта использования. - person Andrew Thompson; 07.09.2011
comment
@kleopatra достаточно мощный LayoutManager Хорошо, я укушу. Давайте не будем ограничивать это J2SE. Какой менеджер компоновки может правильно определить размер * JEditorPane или JTextPane без использования setPreferredSize(), магических чисел (указывающих размер), переданных в ограничения или конструктор макета, или HTML с CSS, указывающим ширину? ( * И я действительно имею в виду «за исключением гадания или гаруспики». ;) - person Andrew Thompson; 07.09.2011
comment
хах.. Я знал, что вы это сделаете :-) Как упоминалось в другом месте, можно использовать LayoutManager вместо компонента, в каких бы единицах измерения ни были необходимы ограничения. Могущественный менеджер делает это достаточно легко. - person kleopatra; 07.09.2011
comment
Я думаю, что вопрос только о JTextField. Мы знаем, что есть и другие компоненты. - person Mehdi; 02.12.2016