gpt4 book ai didi

java - JTextPane 中未呈现 CSS 填充

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:20 24 4
gpt4 key购买 nike

我正在使用 JTextPane呈现一些 HTML。我正在使用 HTMLEditorKit 和一个 StyleSheet code 添加规则属性,因此它看起来与 StackOverflow 上的代码完全一样。问题是 JTextPane不会在代码上呈现填充(顶部/底部 1 像素,左侧/右侧 5 像素),即使 padding属性被列为渲染引擎支持的属性之一 in the documentation .

这是我希望看到的(如 this CSSDeck Lab 所示): Expected Output
↑-↑ ↑-↑
编辑:
我已经不再使用 <code>我的 HTML 中的标记并已切换到 <span>根据@Sharcoux 的建议。这使得 used-to-be-code 的字体大小与 <pre> 中的文本相同标签,使红色背景与绿色边框具有相同的高度,但是,仍然没有产生预期的结果。 Here如果您有兴趣,是原始图像。

这是实际出现的: Actual Output

我也试过移动 CSS 与文本内联,但无济于事。

MCVE(也经过编辑):

import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;

public class CodePaddingMCVE {

public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame frame = new JFrame("Code Padding Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JTextPane tp = new JTextPane();
tp.setContentType("text/html");

HTMLEditorKit kit = new HTMLEditorKit();
tp.setEditorKit(kit);
StyleSheet sheet = kit.getStyleSheet();
sheet.addRule("span {padding: 1px 5px; background-color: red}"); //Using span here
sheet.addRule("pre {padding: 0px; background-color: green}");
tp.setDocument(kit.createDefaultDocument());
tp.setText("<html><pre>NotCode<span>Code</span>NotCode</pre></html>"); //Using <span> here too

JScrollPane sp = new JScrollPane(tp) {
private static final long serialVersionUID = 1L;

@Override
public Dimension getPreferredSize() {
return new Dimension(250, 50);
}

};

frame.getContentPane().add(sp);
frame.pack();
frame.setVisible(true);
});
}

}

我使用的是 OS X Yosemite 10.10.15、Eclipse Mars.2 4.5.2 和 Java 8 [1.8.0_66]。

最佳答案

你是对的,margin 和 padding 似乎不适用于行内元素。您有 3 个选项。

1) 放弃 JTextPane,改用 JavaFX WebView。

2) 放弃 HTMLDocument 并使用其他实现。

3) 尝试在 HTMLEditorKit 中扩展 HTMLFactory,并扩展 InlineView。它会给你这样的东西:

import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.Element;
import javax.swing.text.StyleConstants;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.InlineView;
import javax.swing.text.html.StyleSheet;

public class CodePaddingMCVE {

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Code Padding Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JTextPane tp = new JTextPane();
tp.setContentType("text/html");

HTMLEditorKit kit = new HTMLEditorKit() {
public ViewFactory getViewFactory() {
return new HTMLFactory() {
public View create(Element elem) {
AttributeSet attrs = elem.getAttributes();
Object elementName =
attrs.getAttribute(AbstractDocument.ElementNameAttribute);
Object o = (elementName != null) ?
null : attrs.getAttribute(StyleConstants.NameAttribute);
if (o instanceof HTML.Tag) {
HTML.Tag kind = (HTML.Tag) o;
if (kind == HTML.Tag.CONTENT) {
return new InlineView(elem) {
private short left;
private short right;
private short top;
private short bottom;
protected void setPropertiesFromAttributes() {
AttributeSet attr = getAttributes();
if (attr != null) {
top = (short) StyleConstants.getSpaceAbove(attr);
left = (short) StyleConstants.getLeftIndent(attr);
bottom = (short) StyleConstants.getSpaceBelow(attr);
right = (short) StyleConstants.getRightIndent(attr);
}
super.setPropertiesFromAttributes();
}
//TODO : use the top, left, bottom and right properties to draw the margin/padding
};
}
}
return super.create(elem);
}
};
}
};
tp.setEditorKit(kit);
StyleSheet sheet = kit.getStyleSheet();
sheet.addRule("span {padding: 5px 5px 5px 5px; background-color: red}"); //Using span here
sheet.addRule("pre {padding: 0px; background-color: green}");
tp.setDocument(kit.createDefaultDocument());
tp.setText("<html><pre>NotCode<span>Code</span>NotCode</pre></html>"); //Using <span> here too

JScrollPane sp = new JScrollPane(tp) {
private static final long serialVersionUID = 1L;

@Override
public Dimension getPreferredSize() {
return new Dimension(250, 50);
}

};

frame.getContentPane().add(sp);
frame.pack();
frame.setVisible(true);
}
});
}
}

如果您希望走这条路,您将需要深入 LabelView 和 GlyphView 以了解如何实现填充或边距。也许其他人可以帮助完成这项工作。

祝你好运。

关于java - JTextPane 中未呈现 CSS 填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39311684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com