2009-03-25 24 views

risposta

1

JEditorPane non supporta questo, ma si può fare un po 'che si estende per aggiungere le funzionalità necessarie ...

Prova questo:

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

+0

grazie, sfortunatamente non sembra funzionare con il mio HTMLEditorKit, la dimensione del testo non è più grande. – Tom

+0

avrete bisogno di personalizzarlo per un HTMLEditorKit, questo tutorial fa la stessa cosa, ma per StyledEditorKit. – stephendl

+0

Non ero in grado di farlo, classe StyledViewFactory implementa ViewFactory non supporta il formato HTML, il valore di default per LabelView causando molti problemi. – Tom

0

Partenza TransformUI, che è un cool "estensione" di JXLayer. Avviare il demo, e hanno la mascella goccia! ;-) (seleziona la casella di controllo 'Auto pack')

Fondamentalmente, ciò che fa è impostare un ridimensionamento AffineTransform prima di richiamare la vernice sul componente, avendo quindi tutto il componente scalato. Così, il vostro zoom è proprio lì ..!

2

ho fatto il mio HTMLEditorKit personalizzato che può zoom in/out il contenuto HTML di un JEditorPane, che hanno anche una migliore performance di rendering, ho chiamato 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); 
      } 

     } 
} 

Ed ecco la richiesta 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; 
     } 
} 

Quindi è possibile utilizzare in questo modo:

//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)); 
Problemi correlati