代码之家  ›  专栏  ›  技术社区  ›  Sam Barnum

将RTF/HTML字符串绘制到自定义swing组件中

  •  0
  • Sam Barnum  · 技术社区  · 16 年前

    JTextPane

    然后,我需要在自定义组件中的特定坐标处渲染许多这些样式注释。

    我认为 View.paint

    public View createView() throws IOException, BadLocationException {
     RTFEditorKit kit = new RTFEditorKit();
     final Document document = kit.createDefaultDocument();
     kit.read(new ByteArrayInputStream(text.getBytes("UTF-8")), document, 0);
     return kit.getViewFactory().create(document.getDefaultRootElement());
    }
    

    majorAxis = 1
    majorSpan = 0
    minorSpan = 0
    majorReqValid = false
    minorReqValid = false
    majorRequest = null
    minorRequest = null
    majorAllocValid = false
    majorOffsets = {int[0]@2321}
    majorSpans = {int[0]@2322}
    minorAllocValid = false
    minorOffsets = {int[0]@2323}
    minorSpans = {int[0]@2324}
    tempRect = {java.awt.Rectangle@2325}"java.awt.Rectangle[x=0,y=0,width=0,height=0]"
    children = {javax.swing.text.View[1]@2326}
    nchildren = 0
    left = 0
    right = 0
    top = 0
    bottom = 0
    childAlloc = {java.awt.Rectangle@2327}"java.awt.Rectangle[x=0,y=0,width=0,height=0]"
    parent = null
    elem = {javax.swing.text.DefaultStyledDocument$SectionElement@2328}"BranchElement(section) 0,35\n"
    

    JTextPane.getUI().paint ,但文本窗格需要可见,这感觉是错误的做法。

    是否有任何方法可以在不呈现实际JTextPane的情况下获得RTF内容的视觉表示?

    2 回复  |  直到 16 年前
        1
  •  0
  •   camickr    16 年前

    这段代码有点有效,但似乎不太理想。有更好的方法吗?此外,在图形上除0,0之外的其他位置渲染文本的好方法是什么?

    private static void testRtfRender() {
        String s = "{\\rtf1\\ansi\n" +
                "{\\fonttbl\\f0\\fnil Monospaced;\\f1\\fnil Lucida Grande;}\n" +
                "\n" +
                "\\f1\\fs26\\i0\\b0\\cf0 this is a \\b test\\b0\\par\n" +
                "}";
    
        JTextPane pane = new JTextPane();
        pane.setContentType("text/rtf");
        pane.setText(s);
    
        final Dimension preferredSize = pane.getUI().getPreferredSize(pane);
        int w = preferredSize.width;
        int h = preferredSize.height;
    
        pane.setSize(w, h);
        pane.addNotify();
        pane.validate();
    
        // would be nice to use this box view instead of instantiating a UI
        // however, unless you call setParent() on the view it's useless
        // What should the parent of a root element be?
        //BoxView view = (BoxView) pane.getEditorKit().getViewFactory().create(pane.getStyledDocument().getDefaultRootElement());
        //view.paint(d, new Rectangle(w, h));
    
        BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        final Graphics2D d = img.createGraphics();
        d.setClip(0, 0, w, h); // throws a NullPointerException if I leave this out
        pane.getUI().paint(d, pane);
        d.dispose();
        JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)));
    }
    
        2
  •  1
  •   Sam Barnum    16 年前

    ScreenImage 类,它允许您创建任何Swing组件的BufferedImage。它也应该适用于不可见的Swing组件,但是的,您必须先进行渲染。

    推荐文章