更改JTextArea中特定行的字体

3

你好,我正在开发一个聊天应用程序,希望用户可以更改他/她正在编写的字体。有一个setFont()函数,但它会改变TextArea中所有字符串的字体。所以我只想改变我的字体。如果您能帮助我,我将不胜感激。


可能是重复的问题:如何在JTextArea中更改文本颜色? - Suma
4个回答

10

那么我猜我必须学一些 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) {}

哈哈...我没有读完所有的答案 :-) 因为你符合我的期望,所以给你点赞。 - kleopatra
是的,我终于成功理解并使用了你的代码,但我想我必须计算所有字符才能将字符串插入到末尾。 :) - quartaela
@user743898,要在末尾插入,您可以使用 textPane.getDocument().getLength() - camickr

3

您应该使用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,这将允许您在TextPane中使用HTML。以下是另一段代码,您可以在面板中添加彩色文本:

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();
    }
}

希望这有所帮助, Serhiy.

那么我想我必须学一点HTML了:)。这段代码对我很有帮助。谢谢伙计。 - quartaela

2

你无法使用JTextArea实现这个功能,但是你可以使用它更高级的表亲JTextPane来实现。不幸的是,这并不是一个简单的过程;你可以在这里了解更多关于这个类的信息


我猜我必须使用带有HTML的TextPane :D - quartaela

1

许多Swing组件可以呈现基本的HTML(版本3.2),包括JLabelJEditorPane。有关更多详细信息,请参见Java教程中的如何在Swing组件中使用HTML

这里是一个使用后者的简单示例。

Fonts rendered in 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);
            }
        });
    }
}

我被你的JOptionPane搞疯了 +1 - mKorbel
@mKorbel 这只是懒惰罢了 - 比制作一个 JFrame 少了几行代码。 ;) - Andrew Thompson
但这另当别论——我想在这里挑剔的是,使用OptionPane的快捷方式将硬编码的尺寸从顶层容器移到了一个子容器中(顺便说一下,我很喜欢它)。 - kleopatra
@kleopatra 好的 - 我会承认您上一个观点是正确的。仔细重新阅读 OP 的问题后,我意识到 HTML / JEP 路线并不适用于经常更改文本的情况,这也是我认为该问题所暗示的。JTextPane 是这种用例的绝佳选择。 - Andrew Thompson
@kleopatra "强大的LayoutManager" 好的 - 我来试试。让我们不限于J2SE。有哪个布局管理器可以在不使用setPreferredSize()、传递给布局约束或构造函数的魔数(指定大小)或使用CSS指定宽度的HTML的情况下,正确地调整JEditorPaneJTextPane的大小?( *我的意思是,“除了占卜或解剖之外”。;) - Andrew Thompson
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接