如何为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
相关产品推荐
相关产品推荐

