a demo about using JBHtmlPane component to report error conv is null
public class RefactorChatWindow implements DumbAware, ToolWindowFactory
@Overridepublic void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
JFrame frame = new JFrame("CodeContentCellHighlightComponent Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 600); JPanel parentComponent = new JPanel(new BorderLayout()); parentComponent.setPreferredSize(new Dimension(800, 600)); String codeContent = "\npublic class QuickSort {\n public static void main(String[] args) {\n System.out.println(\"Hello World!\");\n }\n}"; String language = "java"; CodeContentCellHighlightComponent highlightComponent = new CodeContentCellHighlightComponent(project, codeContent, language, parentComponent, 800, true); parentComponent.add(highlightComponent, BorderLayout.CENTER); frame.getContentPane().add(parentComponent); frame.setVisible(true);
CodeContentCellHighlightComponent
private final Project project; private final ToolbarPane toolbarPane; private final JComponent parentComponent; Dimension parentComponentSize; private final CodeJBHtmlPane editorTextField; private JScrollPane jbScrollPane; private String lang; @Getter private String content;
public CodeContentCellHighlightComponent(Project project, String content, String language, JComponent parentComponent, int limitCodeBlockHeight, boolean isOwner) { super(new BorderLayout()); this.project = project; this.lang = language; this.content = content; this.parentComponent = parentComponent; this.parentComponentSize = parentComponent.getSize(); // 创建核心显示组件 content = "\npublic class QuickSort {\n"; language = "java"; this.editorTextField = new CodeJBHtmlPane(content, language); // 创建滚动条面板 createJScrollPaneUI(); this.add(jbScrollPane, BorderLayout.CENTER); // 渲染markdown内容 if (StringUtils.isNotBlank(content)) { editorTextField.setLanguage(language); editorTextField.setText(content); } super.addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent e) { CodeContentCellHighlightComponent.this.revalidate(); CodeContentCellHighlightComponent.this.repaint(); } }); }
private void createJScrollPaneUI() { jbScrollPane = new JBScrollPane(editorTextField); jbScrollPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); jbScrollPane.setMinimumSize(new Dimension(500, 1000)); jbScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); jbScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);}
CodeJBHtmlPane
public class CodeJBHtmlPane extends JBHtmlPane implements RefreshColorComponent { private static final Logger log = LoggerFactory.getLogger(CodeTextPane.class); private static Code2HtmlConverter converter = new PrismCode2HtmlConverter(); private static final String DEFAULT_LANGUAGE = "markdown"; private String language; private String originText; private String template; public CodeJBHtmlPane(String content, String language) { super(JBHtmlPaneStyleConfiguration.builder().build(), JBHtmlPaneConfiguration.builder().build()); // 使用默认的配置 // 初始化设置 this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); this.originText = content; this.template = ThemeUtil.loadCodeGeneralTemplate(); this.template = SchemaColorUtil.applySchemaColor(this.template); this.setEditable(false); this.setFocusable(true); this.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR)); if (StringUtils.isBlank(language)) { language = this.getDefaultLanguage(); } else { language = language.trim(); } this.language = language; this.setFont(FontUtil.loadFont("font/SourceHanSansCN-Regular.otf", Font.PLAIN, 14f)); this.setText(content); } @Override public void scrollRectToVisible(Rectangle aRect) { // 此方法可留空,保持默认行为 } private String buildText(String text, String language) { if (StringUtils.isBlank(this.template)) { return text; } else { language = language.toLowerCase(Locale.ROOT); text = StringUtils.stripEnd(text, "\n\t "); String html = converter.convert(text, language); if (html == null) { html = StringUtil.escapeXmlEntities(text); } EditorColorsScheme editorColorsScheme = EditorColorsManager.getInstance().getGlobalScheme(); Font font = editorColorsScheme.getFont(EditorFontType.PLAIN); String fontFamily = font.getFamily(); Color editorColor = UIUtil.getEditorPaneBackground(); String editorBackgroundColor = String.format("#%02x%02x%02x", editorColor.getRed(), editorColor.getGreen(), editorColor.getBlue()); return this.template.replace("{{fontFamily}}", fontFamily) .replace("{{content}}", html) .replace("{{language}}", language) .replace("{{background}}", editorBackgroundColor); } } @Override public Color getSelectionColor() { return PluginColor.MARK_DOWN_CODE_SELECT_BG_COLOR; } @Override public void setText(String text) { this.originText = text; String htmlContent = this.buildText(text, this.language); try { super.setText(htmlContent); } catch (Exception e) { log.error("Error setting text in CodeTextPane", e); } } @Override public String getText() { return this.originText; } private String getDefaultLanguage() { return DEFAULT_LANGUAGE; } public void setLanguage(String language) { if (StringUtils.isNotBlank(language)) { this.language = language.trim(); } } public void refreshColor(EditorColorsScheme scheme, Color themeColor) { this.template = ThemeUtil.loadCodeGeneralTemplate(); this.template = SchemaColorUtil.applySchemaColor(this.template); this.setText(this.getText()); this.invalidate(); this.repaint(); }}

Converting code to HTML is correct because it can be rendered correctly when opened directly in a browser. Otherwise, IDEA will display normally between January 2023 and January 2024, but this issue will occur in February 2024
Post is closed for comments.
Please do not open new threads https://intellij-support.jetbrains.com/hc/en-us/community/posts/22579053576338-Cannot-invoke-javax-swing-text-html-CSS-CssValue-parseCssValue-String-because-conv-is-null