2009-03-25 86 views

Trả lời

1

JEditorPane không hỗ trợ này, nhưng bạn có thể làm một chút mở rộng thêm các chức năng bạn cần ...

Hãy thử điều này:

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

+0

cảm ơn, rất tiếc là dường như nó không hoạt động với HTMLEditorKit của tôi, kích thước văn bản không lớn hơn. – Tom

+0

bạn sẽ cần phải tùy chỉnh nó cho một HTMLEditorKit, hướng dẫn này làm điều tương tự nhưng đối với StyledEditorKit. – stephendl

+0

Tôi đã không thể làm điều đó, lớp thực hiện StyledViewFactory ViewFactory không hỗ trợ HTML, mặc định là LabelView gây ra nhiều vấn đề. – Tom

0

Check-out TransformUI, mà là một "tiện ích" thú vị của JXLayer. Bắt đầu demo và giảm hàm của bạn! ;-) (nhấn hộp kiểm 'Tự động đóng gói')

Về cơ bản, những gì nó làm là đặt AffineTransform theo tỷ lệ trước khi gọi sơn lên thành phần, do đó có mọi thứ mà thành phần này tăng lên. Vì vậy, zoom của bạn là phải có ..!

2

tôi đã HTMLEditorKit tùy chỉnh của tôi có thể zoom in/out nội dung HTML của một JEditorPane, nó có ngay cả một hiệu suất render tốt hơn, tôi gọi nó là 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); 
      } 

     } 
} 

và đây là yêu cầu 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; 
     } 
} 

Sau đó, bạn có thể sử dụng nó theo cách này:

//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)); 
Các vấn đề liên quan