Java字符串replaceAll()

2024-01-04

我一直想知道是否例如:

    JTextPane chatTextArea = new JTextPane();
    s.replaceAll(":\\)", emoticon());

    public String emoticon(){
           chatTextArea.insertIcon(new ImageIcon(ChatFrame.class.getResource("/smile.png")));
           return "`";
       }

可以放一张图片,到处都是“:)”,找到“`”。当我像这样运行它时,如果 s 包含“:)”,那么整个 s 就会被图标替换。 有办法做到吗?


这是我制作的一个小例子(+1 给@StanislavL 原始版本),简单地使用DocumentListener并检查何时输入表情符号的匹配序列并将其替换为适当的图像:

NB: SPACE must be pressed or another character/emoticon typed to show image

import java.awt.Dimension;
import java.awt.Image;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.text.Utilities;

public class JTextPaneWithEmoticon {

    private JFrame frame;
    private JTextPane textPane;
    static ImageIcon smiley, sad;
    static final String SMILEY_EMOTICON = ":)", SAD_EMOTICON = ":(";
    String[] emoticons = {SMILEY_EMOTICON, SAD_EMOTICON};

    private void initComponents() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        textPane = new JTextPane();

        //add docuemntlistener to check for emoticon insert i.e :)
        ((AbstractDocument) textPane.getDocument()).addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(final DocumentEvent de) {
                //We should surround our code with SwingUtilities.invokeLater() because we cannot change document during mutation intercepted in the listener.
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        try {
                            StyledDocument doc = (StyledDocument) de.getDocument();
                            int start = Utilities.getRowStart(textPane, Math.max(0, de.getOffset() - 1));
                            int end = Utilities.getWordStart(textPane, de.getOffset() + de.getLength());

                            String text = doc.getText(start, end - start);

                            for (String emoticon : emoticons) {//for each emoticon

                                int i = text.indexOf(emoticon);
                                while (i >= 0) {
                                    final SimpleAttributeSet attrs = new SimpleAttributeSet(doc.getCharacterElement(start + i).getAttributes());
                                    if (StyleConstants.getIcon(attrs) == null) {

                                        switch (emoticon) {//check which emtoticon picture to apply
                                            case SMILEY_EMOTICON:
                                                StyleConstants.setIcon(attrs, smiley);
                                                break;
                                            case SAD_EMOTICON:
                                                StyleConstants.setIcon(attrs, sad);
                                                break;
                                        }

                                        doc.remove(start + i, emoticon.length());
                                        doc.insertString(start + i, emoticon, attrs);
                                    }
                                    i = text.indexOf(emoticon, i + emoticon.length());
                                }
                            }
                        } catch (BadLocationException ex) {
                            ex.printStackTrace();
                        }
                    }
                });
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
            }
        });

        JScrollPane scrollPane = new JScrollPane(textPane);
        scrollPane.setPreferredSize(new Dimension(300, 300));

        frame.add(scrollPane);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        try {//attempt to get icon for emoticons
            smiley = new ImageIcon(ImageIO.read(new URL("http://facelets.com/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/e/m/emoticons0001.png")).getScaledInstance(24, 24, Image.SCALE_SMOOTH));
            sad = new ImageIcon(ImageIO.read(new URL("http://zambia.primaryblogger.co.uk/files/2012/04/sad.jpg")).getScaledInstance(24, 24, Image.SCALE_SMOOTH));

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JTextPaneWithEmoticon().initComponents();
            }
        });
    }
}

参考:

  • 如何在java swing中添加笑脸? https://stackoverflow.com/questions/5320685/how-to-add-smileys-in-java-swing
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java字符串replaceAll() 的相关文章

随机推荐

  • QT:使函数在某个时刻暂停一段时间

    我有 QT 问题 我想让我的程序在我定义的地方停止 比如说 3 秒钟 我没能做到这一点 我需要它 因为早些时候我的程序生成文件 并且它被我稍后调用的程序使用 问题是 该文件似乎没有足够的时间来创建 我的代码如下所示 void MainWin
  • 重建时,以基本形式定义的自定义属性将失去其继承形式的状态

    我在处理基本表单的属性时遇到问题 无法以继承的形式维护状态 环境 Visual Studio 2010 终极服务包 1 版本 10 0 40219 1 SP1Rel Net框架 版本4 0 30319 SP1Rel Windows 7旗舰版
  • 带有 Spring-Boot/Security 的 Null @AuthenticationPrincipal

    我根据以下内容设置了我的 Spring Security 应用程序参考文件 http docs spring io spring security site docs current reference htmlsingle 经过几个小时的
  • junit 测试-assertEquals 异常

    如何使用assertEquals来查看异常消息是否正确 测试通过了 但我不知道它是否遇到正确的错误 我正在运行的测试 Test public void testTC3 try assertEquals Legal Values Packag
  • 易失性是否足以更改对列表的引用?

    假设我们有一个列表引用 volatile List a 现在线程 1 初始化它 List newA new LinkedList lt gt newA add new String a Write to a volatile a newA
  • 使用 cookie 的 ASP.NET Web api“记住我”功能

    我正在尝试实施一个 记住账号 我的功能Web Api项目 我想 有记住账号当用户使用时的功能Sign In save a cookies用于保持用户始终登录 以便用户无需键入username and password他们每次访问网站时 通过
  • 私有属性的命名约定

    我见过下划线用作私有属性的前缀 private var aPrivateVar String I am private 我见过它们没有被使用过 private var aPrivateVar String I am private 从语法上
  • 如何使用C-API在Lua 5.1中创建表中表?

    我需要在 Lua 中创建这样的结构5 1C API 不在 Lua 5 2 及以上版本中 a b c d e GOOD print a b c d e 预期结果 良好 感谢您的解答 Lua C API 是基于堆栈的 这意味着大多数 C API
  • 如何以编程方式创建全屏TableLayout(表格高度意外折叠)

    下列TableLayout完全符合我的要求 它填充其父级并且列均匀拉伸
  • 如何在 github 存储库中执行状态检查

    我有一个 GitHub 存储库 在其中我使用以下新功能保护一个分支受保护的分支 https github com blog 2051 protected branches and required status checks 现在我的问题是
  • Bash 中“${!x}”间接扩展的安全注意事项

    假设我有一个变量 说x 包含未知的任意数据 以下间接扩展是否存在代码注入或其他形式的漏洞利用的风险 ARBITRARY COMMAND x 我知道有些情况下x分配给有用的现实生活场景本身可能会带来风险 需要适当控制或清理 但我在这里假设x已
  • 在 Woocommerce 订单和电子邮件中显示产品变体的自定义字段

    我成功地在 WooCommerce 后端添加了产品变体的自定义字段 并能够显示其值 我也想在订单和电子邮件中包含此值 Display Fields in admin on product edit screen add action woo
  • Flash AS3 中的文本链接

    因此 我自己为一些通过 Dropbox 工作的朋友制作了一个 wiki 式的应用程序 这意味着所有文件都存储在本地并由每个人更新 每个文件都是由 Flash 拉入的 txt 文件 然后使用简单的导航和搜索工具显示 现在我正尝试更进一步并链接
  • 在 Rmarkdown 中的每个部分中创建引用

    我想使用 Rmarkdown 但我读到的是 当使用 pandoc 创建参考书目时 引用位于文档末尾 pandoc citeproc 问题 多个参考书目 nocite citeonly https groups google com foru
  • 在 .NET 中处理和返回值

    考虑以下 TextReader reader new StreamReader file XmlSerializer xmlSerializer new XmlSerializer typeof T return T xmlSerializ
  • 更改自定义属性值

    我有一些代码 其中添加了我想要更改其值的自定义属性 div div 这是我正在尝试的 somebutton click function myCustomElement val SomeNewValue 但一切都没有改变 我怎样才能让它发挥
  • 从 Metafor 中的混合效应多级模型获取 R 平方

    我正在 R 中对森林的特定处理进行荟萃分析 对于这个模型 我需要拟合随机效应来解释研究方法的差异和地点年龄的变化之间的差异 因为这两个都是混杂变量 而且我对调查由它们引起的变化并不明确感兴趣 然而 据我所知 包裹 metfor 当您拥有多级
  • Git - 查找索引中单个文件的 SHA1

    我已将一个文件添加到 索引 git add myfile java 如何找到该文件的 SHA1 这是一个老问题 但有一件事需要澄清 这个问题和下面的答案讨论Git 哈希值一个文件的不完全一样 该文件的 SHA1 正如问题中所问 简而言之 如
  • Flex - 访问另一个 mxml 页面上的静态变量时出现问题

    首先 mxml 包含 Datefield 控件如下
  • Java字符串replaceAll()

    我一直想知道是否例如 JTextPane chatTextArea new JTextPane s replaceAll emoticon public String emoticon chatTextArea insertIcon new