gpt4 book ai didi

java - 使用 HTMLEditorKit 缓慢解析动态 JTextPane

转载 作者:行者123 更新时间:2023-11-30 06:50:13 26 4
gpt4 key购买 nike

我遇到以下问题,即我将 JTextPane 与 HTMLEditorKit 结合使用,并向 Pane 动态添加内容。内容可以超过几行,还包含大量图像(小图标)。现在的问题是,如果我插入例如一堆带有图标的文本,通过:

editorKit.insertHTML(doc, doc.getLength(), htmlCode, 0, 0, null);

结果是,html 代码中的图像需要很长时间才能出现在屏幕上(约 1 秒):

enter image description here

问题:如果是 html 代码,有没有办法缓冲 Pane 中显示的图像:

imgsrc = "file:/" + imgSRCOnHDD;
imgsrc = imgsrc.replace("\\", "/");
imgSub = "<img height=\"18\" width=\"18\" style=\"vertical-align:middle;\" src='" + imgsrc + "'></img>";

由于 HTMLEditor,我无法使用 pane.insertIcon。是否可能有某种容器将其设置为不可见,将内容添加到 Pane ,然后将容器设置为可见?

最佳答案

@StanislavL 的评论让我解决了问题,虽然不是他提供的链接,但它不起作用,我找不到原因,URL 是正确的,我仔细检查了,但设置缓存后, Pane 总是会显示每个图像的“断开的链接”图片。于是我找到了这篇帖子,了解了HTMLEditorKit的缓存机制:

https://stackoverflow.com/a/27669916/7377320

提到的代码:

public class ImageCache extends Hashtable {

public Object get(Object key) {

Object result = super.get(key);

if (result == null){

result = Toolkit.getDefaultToolkit().createImage((URL) key);
put(key, result);
}

return result;
}
}

...

Dictionary cache = (Dictionary) pane.getDocument().getProperty("imageCache");

if (cache == null) {

cache = new ImageCache();
pane.getDocument().putProperty("imageCache", cache);
}

工作完美,现在正在工作。我还对 HTMLEditorKit 的 ImageView 进行了此更改:

public class MyImageView extends ImageView {

public MyImageView(Element elem) {
super(elem);
}

@Override
public Icon getNoImageIcon() {
return null;
}

@Override
public Icon getLoadingImageIcon() {
return null;
}
}

这不会再在 Pane 中显示任何损坏的链接图片,也不会“预加载”损坏的链接图片。

HTMLEditorKit:

public class MyHTMLEditorKit extends HTMLEditorKit {

@Override
public ViewFactory getViewFactory() {

return new HTMLEditorKit.HTMLFactory() {

public View create(Element e) {

View v = super.create(e);

Object o = e.getAttributes().getAttribute(StyleConstants.NameAttribute);

if (o instanceof HTML.Tag) {

HTML.Tag kind = (HTML.Tag) o;

if (kind == HTML.Tag.IMG) {
return new MyImageView(e);
}
}

if (v instanceof InlineView) {

return new InlineView(e) {

public int getBreakWeight(int axis, float pos, float len) {
return View.GoodBreakWeight;
}

public View breakView(int axis, int p0, float pos, float len) {

if (axis == View.X_AXIS) {

checkPainter();

int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len);
if (p0 == getStartOffset() && p1 == getEndOffset()) {
return this;
}

return createFragment(p0, p1);
}

return this;
}
};
} else if (v instanceof ParagraphView) {

return new ParagraphView(e) {

protected javax.swing.SizeRequirements calculateMinorAxisRequirements(int axis, javax.swing.SizeRequirements r) {

if (r == null) {
r = new javax.swing.SizeRequirements();
}

float pref = layoutPool.getPreferredSpan(axis);
float min = layoutPool.getMinimumSpan(axis);

// Don't include insets, Box.getXXXSpan will include them.
r.minimum = (int) min;
r.preferred = Math.max(r.minimum, (int) pref);
r.maximum = Integer.MAX_VALUE;
r.alignment = 0.5f;

return r;
}

};
}

return v;
}
};
}
}

关于java - 使用 HTMLEditorKit 缓慢解析动态 JTextPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42968499/

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