gpt4 book ai didi

java - 是否可以在 JEditorPane 中缩放/缩放字体大小(和图像大小)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:27:35 27 4
gpt4 key购买 nike

有没有可能在JEditorPane中以某种方式缩放文本和图片。

我不喜欢遍历所有 HTML 页面来使字体变大。

最佳答案

我定制了 HTMLEditorKit,它可以放大/缩小 JEditorPane 的 HTML 内容,它具有更好的渲染性能,我称之为 LargeHTMLEditorKit:

/**
* An extended {@link HTMLEditorKit} that allow faster
* rendering of large html files and allow zooming of content.
* @author Alessio Pollero
* @version 1.0
*/
public class LargeHTMLEditorKit extends HTMLEditorKit {

ViewFactory factory = new MyViewFactory();

@Override
public ViewFactory getViewFactory() {
return factory;
}

class MyViewFactory extends HTMLFactory {
@Override
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.HTML) {
return new HTMLBlockView(elem);
}
else if (kind == HTML.Tag.IMPLIED) {
String ws = (String) elem.getAttributes().getAttribute(CSS.Attribute.WHITE_SPACE);
if ((ws != null) && ws.equals("pre")) {
return super.create(elem);
}
return new HTMLParagraphView(elem);
} else if ((kind == HTML.Tag.P) ||
(kind == HTML.Tag.H1) ||
(kind == HTML.Tag.H2) ||
(kind == HTML.Tag.H3) ||
(kind == HTML.Tag.H4) ||
(kind == HTML.Tag.H5) ||
(kind == HTML.Tag.H6) ||
(kind == HTML.Tag.DT)) {
// paragraph
return new HTMLParagraphView(elem);
}
}
return super.create(elem);
}

}


private class HTMLBlockView extends BlockView {

public HTMLBlockView(Element elem) {
super(elem, View.Y_AXIS);
}

@Override
protected void layout(int width, int height) {
if (width<Integer.MAX_VALUE) {
super.layout(new Double(width / getZoomFactor()).intValue(),
new Double(height *
getZoomFactor()).intValue());
}
}

public double getZoomFactor() {
Double scale = (Double) getDocument().getProperty("ZOOM_FACTOR");
if (scale != null) {
return scale.doubleValue();
}

return 1;
}

@Override
public void paint(Graphics g, Shape allocation) {
Graphics2D g2d = (Graphics2D) g;
double zoomFactor = getZoomFactor();
AffineTransform old = g2d.getTransform();
g2d.scale(zoomFactor, zoomFactor);
super.paint(g2d, allocation);
g2d.setTransform(old);
}

@Override
public float getMinimumSpan(int axis) {
float f = super.getMinimumSpan(axis);
f *= getZoomFactor();
return f;
}

@Override
public float getMaximumSpan(int axis) {
float f = super.getMaximumSpan(axis);
f *= getZoomFactor();
return f;
}

@Override
public float getPreferredSpan(int axis) {
float f = super.getPreferredSpan(axis);
f *= getZoomFactor();
return f;
}

@Override
public Shape modelToView(int pos, Shape a, Position.Bias b) throws BadLocationException {
double zoomFactor = getZoomFactor();
Rectangle alloc;
alloc = a.getBounds();
Shape s = super.modelToView(pos, alloc, b);
alloc = s.getBounds();
alloc.x *= zoomFactor;
alloc.y *= zoomFactor;
alloc.width *= zoomFactor;
alloc.height *= zoomFactor;

return alloc;
}

@Override
public int viewToModel(float x, float y, Shape a,
Position.Bias[] bias) {
double zoomFactor = getZoomFactor();
Rectangle alloc = a.getBounds();
x /= zoomFactor;
y /= zoomFactor;
alloc.x /= zoomFactor;
alloc.y /= zoomFactor;
alloc.width /= zoomFactor;
alloc.height /= zoomFactor;

return super.viewToModel(x, y, alloc, bias);
}

}
}

这是必需的 HTMLParagraphView :

class HTMLParagraphView extends ParagraphView {

public static int MAX_VIEW_SIZE=100;

public HTMLParagraphView(Element elem) {
super(elem);
strategy = new HTMLParagraphView.HTMLFlowStrategy();
}

public static class HTMLFlowStrategy extends FlowStrategy {
protected View createView(FlowView fv, int startOffset, int spanLeft, int rowIndex) {
View res=super.createView(fv, startOffset, spanLeft, rowIndex);
if (res.getEndOffset()-res.getStartOffset()> MAX_VIEW_SIZE) {
res = res.createFragment(startOffset, startOffset+ MAX_VIEW_SIZE);
}
return res;
}

}
public int getResizeWeight(int axis) {
return 0;
}
}

然后你可以这样使用它:

//Create a new JEditorPane
JEditorPane yourPane = new JEditorPane();
//Set the custom HTMLEditorKit
yourPane.setEditorKit(new LargeHTMLEditorKit());
//Set the zoom to 150%
yourPane.getDocument().putProperty("ZOOM_FACTOR", new Double(1.5));

关于java - 是否可以在 JEditorPane 中缩放/缩放字体大小(和图像大小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/680817/

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