You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为RSyntaxTextArea实现多行彩色文本的自定义Tooltip

为RSyntaxTextArea添加多行多色自定义Tooltip

需求

为RSyntaxTextArea添加自定义Tooltip,要求Tooltip内文本多行显示不同颜色:第一行红色、第二行黄色、第三行绿色,所有内容处于同一个Tooltip中。

现有实现代码

package org.example;

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

import org.fife.ui.rtextarea.*;
import org.fife.ui.rsyntaxtextarea.*;

public class TextEditorDemo extends JFrame {

    public TextEditorDemo() throws IOException {

        JPanel cp = new JPanel(new BorderLayout());

        RSyntaxTextArea textArea = new RSyntaxTextArea(20, 60);
        textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
        textArea.setCodeFoldingEnabled(true);
        RTextScrollPane sp = new RTextScrollPane(textArea);
        cp.add(sp);

        setContentPane(cp);
        setTitle("Text Editor Demo");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        org.fife.ui.rsyntaxtextarea.Theme theme = org.fife.ui.rsyntaxtextarea.Theme.load(getClass().getResourceAsStream("/org/fife/ui/rsyntaxtextarea/themes/vs.xml"));
        theme.apply(textArea);

    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            try {
                new TextEditorDemo().setVisible(true);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }
}
解决方案

要实现多行多色的Tooltip,不能使用普通字符串Tooltip,需自定义JComponent作为Tooltip内容,通过重写RSyntaxTextArea的createToolTip方法替换默认Tooltip。

步骤1:创建自定义Tooltip组件

编写一个包含多行不同颜色文本的面板,作为Tooltip的内容:

class CustomColorToolTip extends JPanel {
    public CustomColorToolTip() {
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // 添加内边距优化显示
        setBackground(UIManager.getColor("ToolTip.background")); // 匹配默认Tooltip背景色

        // 第一行红色文本
        JLabel line1 = new JLabel("第一行红色内容");
        line1.setForeground(Color.RED);
        add(line1);

        // 第二行黄色文本
        JLabel line2 = new JLabel("第二行黄色内容");
        line2.setForeground(Color.YELLOW);
        add(line2);

        // 第三行绿色文本
        JLabel line3 = new JLabel("第三行绿色内容");
        line3.setForeground(Color.GREEN);
        add(line3);
    }
}

步骤2:重写RSyntaxTextArea的createToolTip方法

修改原代码中的RSyntaxTextArea实例,重写createToolTip方法返回自定义Tooltip:

RSyntaxTextArea textArea = new RSyntaxTextArea(20, 60) {
    @Override
    public JToolTip createToolTip() {
        JToolTip tip = new JToolTip();
        tip.setComponent(this);
        tip.setTipText(null); // 清空默认文本,避免冲突
        tip.add(new CustomColorToolTip());
        return tip;
    }
};

步骤3:添加Tooltip触发逻辑

默认情况下Tooltip需要触发条件,可通过鼠标监听器实现鼠标悬停时显示:

textArea.addMouseMotionListener(new MouseMotionAdapter() {
    @Override
    public void mouseMoved(MouseEvent e) {
        // 可根据鼠标位置获取文本元素,实现精准触发;此处为简单示例,鼠标移动即触发
        textArea.setToolTipText(""); // 触发Tooltip显示
    }
});

完整修改后的代码

package org.example;

import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseEvent;

import org.fife.ui.rtextarea.*;
import org.fife.ui.rsyntaxtextarea.*;

public class TextEditorDemo extends JFrame {

    public TextEditorDemo() throws IOException {

        JPanel cp = new JPanel(new BorderLayout());

        // 自定义RSyntaxTextArea,替换默认Tooltip
        RSyntaxTextArea textArea = new RSyntaxTextArea(20, 60) {
            @Override
            public JToolTip createToolTip() {
                JToolTip tip = new JToolTip();
                tip.setComponent(this);
                tip.setTipText(null);
                tip.add(new CustomColorToolTip());
                return tip;
            }
        };

        textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
        textArea.setCodeFoldingEnabled(true);

        // 添加鼠标监听器触发Tooltip
        textArea.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                textArea.setToolTipText(""); // 触发显示自定义Tooltip
            }
        });

        RTextScrollPane sp = new RTextScrollPane(textArea);
        cp.add(sp);

        setContentPane(cp);
        setTitle("Text Editor Demo");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        org.fife.ui.rsyntaxtextarea.Theme theme = org.fife.ui.rsyntaxtextarea.Theme.load(getClass().getResourceAsStream("/org/fife/ui/rsyntaxtextarea/themes/vs.xml"));
        theme.apply(textArea);

    }

    // 自定义多色Tooltip组件
    class CustomColorToolTip extends JPanel {
        public CustomColorToolTip() {
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            setBackground(UIManager.getColor("ToolTip.background"));

            JLabel line1 = new JLabel("第一行红色内容");
            line1.setForeground(Color.RED);
            add(line1);

            JLabel line2 = new JLabel("第二行黄色内容");
            line2.setForeground(Color.YELLOW);
            add(line2);

            JLabel line3 = new JLabel("第三行绿色内容");
            line3.setForeground(Color.GREEN);
            add(line3);
        }
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            try {
                new TextEditorDemo().setVisible(true);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }
}

注意事项

  • 自定义Tooltip组件时设置了默认Tooltip背景色,避免样式与系统风格冲突。
  • 可根据需求修改触发逻辑,比如仅在鼠标悬停到特定关键字、语法元素时显示Tooltip。

内容的提问来源于stack exchange,提问作者spook

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:55:15