¿Es posible ZOOM de alguna manera texto e imágenes en JEditorPane.es posible ampliar/escalar el tamaño de fuente (y el tamaño de la imagen) en JEditorPane
No me gusta pasar por todas las páginas HTML para agrandar el tamaño de la fuente.
¿Es posible ZOOM de alguna manera texto e imágenes en JEditorPane.es posible ampliar/escalar el tamaño de fuente (y el tamaño de la imagen) en JEditorPane
No me gusta pasar por todas las páginas HTML para agrandar el tamaño de la fuente.
JEditorPane no soporta esto, pero se puede hacer un poco de extender para agregar la funcionalidad que necesita ...
Prueba esto:
Salida TransformUI, que es una buena "extensión" de JXLayer. ¡Abre el demo y ten mucho cuidado! ;-) (marque la casilla de verificación 'Auto paquete')
Básicamente, lo que hace es establecer un AffineTransform de escala antes de invocar pintura sobre el componente, teniendo así todo lo que el componente escala. Por lo tanto, tu zoom está ahí ...!
hice mi HTMLEditorKit personalizado que se puede acercar/alejar el contenido HTML de un JEditorPane, que tiene incluso un mejor rendimiento de la representación, lo llamé 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);
}
}
}
y aquí está la necesaria 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;
}
}
continuación, puede utilizar de esta manera:
//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));
gracias, desafortunadamente no parece funcionar con mi HTMLEditorKit, el tamaño del texto no es mayor. – Tom
tendrá que personalizarlo para un HTMLEditorKit, este tutorial hace lo mismo pero para StyledEditorKit. – stephendl
No pude hacerlo, la clase StyledViewFactory implementa ViewFactory no admite HTML, por defecto LabelView causa muchos problemas. – Tom