2009-03-25 12 views

Respuesta

1

JEditorPane no soporta esto, pero se puede hacer un poco de extender para agregar la funcionalidad que necesita ...

Prueba esto:

http://www.developer.com/java/other/article.php/3315511

+0

gracias, desafortunadamente no parece funcionar con mi HTMLEditorKit, el tamaño del texto no es mayor. – Tom

+0

tendrá que personalizarlo para un HTMLEditorKit, este tutorial hace lo mismo pero para StyledEditorKit. – stephendl

+0

No pude hacerlo, la clase StyledViewFactory implementa ViewFactory no admite HTML, por defecto LabelView causa muchos problemas. – Tom

0

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í ...!

2

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)); 
Cuestiones relacionadas