Paragraph properties with RTF

Discussion in 'Java' started by Ross, Oct 1, 2009.

  1. Ross

    Ross Guest

    I can't seem to modify paragraph properties when creating RTF in java.
    I can change text to bold, italic, etc. But, if I try to set a
    paragraph attribute, e.g. line indent, nothing happens. It's not only
    when I display the document in a JEditorPane, the .rtf file I save to
    disk doesn't have any line indent either.

    What am I doing wrong?

    import javax.swing.text.Document;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.MutableAttributeSet;
    import javax.swing.text.rtf.RTFEditorKit;
    import java.io.FileOutputStream;
    import javax.swing.*;
    import java.awt.*;

    public class RTFTest extends JFrame
    {
    private JEditorPane jep;

    public RTFTest()
    {
    setBounds( 50, 50, 500, 500 );
    setLayout( new BorderLayout() );
    add( jep = new JEditorPane(), BorderLayout.CENTER );
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    jep.setEditable( false );
    jep.setContentType( "text/rtf" );
    }

    public void setDocument( Document d )
    {
    jep.setDocument( d );
    }

    public static void main( String args[] ) throws Exception
    {
    RTFEditorKit aKit = new RTFEditorKit();
    RTFTest r2 = new RTFTest();

    Document d = aKit.createDefaultDocument();
    d.insertString( 0, "Hello world\n", SimpleAttributeSet.EMPTY );
    MutableAttributeSet mas = new SimpleAttributeSet();
    StyleConstants.setBold( mas, true );
    d.insertString( d.getLength(), ".... and this in bold\n", mas );
    StyleConstants.setItalic( mas, true );
    StyleConstants.setBold( mas, false );

    // The following line seems to have no effect. Why?

    StyleConstants.setLeftIndent( mas, 150.0F );

    d.insertString( d.getLength(), "\nThis is another paragraph which
    should be in italic and should be indented a bit", mas );

    FileOutputStream out = new FileOutputStream( "test.rtf" );
    aKit.write( out, d, 0, d.getLength() );
    out.close();
    r2.setDocument( d );
    r2.setVisible( true );
    }
    }
     
    Ross, Oct 1, 2009
    #1
    1. Advertising

  2. Ross

    Roedy Green Guest

    On Thu, 1 Oct 2009 14:35:25 -0700 (PDT), Ross <>
    wrote, quoted or indirectly quoted someone who said :

    >I can't seem to modify paragraph properties when creating RTF in java.


    RTF is human readable. You can look at the documents you generate
    with Java using text editor, and at RTF documents created with a word
    processor and compare. That may be a tool to help you through your
    problem.
    --
    Roedy Green Canadian Mind Products
    http://mindprod.com

    There is one brain organ that is optimised for understanding and articulating logical processes, and that is the outer layer of the brain, called the cerebral cortex. Unlike the rest of the brain, this relatively recent evolutionary development is rather flat, only about 0.32 cm (0.12 in) thick, and includes a mere 6 million neurons. This elaborately folded organ provides us with what little competence we do possess for understanding what we do and who we do it.
    ~ Ray Kurzweil (born: 1948-02-12 age: 61)
     
    Roedy Green, Oct 1, 2009
    #2
    1. Advertising

  3. Ross

    Ross Guest

    On Oct 1, 10:37 pm, Roedy Green <>
    wrote:
    > On Thu, 1 Oct 2009 14:35:25 -0700 (PDT), Ross <>
    > wrote, quoted or indirectly quoted someone who said :
    >
    > >I can't seem to modify paragraph properties when creating RTF in java.

    >
    > RTF is human readable. You can look at the documents you generate
    > with Java using text editor, and at RTF documents created with a word
    > processor and compare. That may be a tool to help you through your
    > problem.


    Yes, I've looked at the output file. It has no sign of any line
    indents.

    {\rtf1\ansi
    {\fonttbl\f0\fnil Monospaced;}

    Hello world\par
    \b .... and this in bold\par
    \i\b0\par
    This is another paragraph which should be in italic and should be
    indented a bit\i0\b0\par
    }

    So, it hasn't helped me find the problem, other than confirm that it's
    not just a problem with the JEditorPane object not displaying the
    indent properly.

    Hence, I'm still stuck.
     
    Ross, Oct 1, 2009
    #3
  4. Ross

    Ross Guest

    The program in this java forum uses the StyledDocument class and seems
    to be able to do everything needed. Perhaps using these classes will
    solve my problem.

    http://www.java-forums.org/awt-swing/2260-how-insert-tables-into-jtextpane.html

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import javax.swing.text.*;

    public class AddingTables {
    JTextPane textPane;

    public AddingTables() {
    String[] text = {
    "This component models paragraphs that are composed of " +
    "runs of character level attributes.\n", // 0 -
    89
    " \n", // 90 -
    91
    "Each paragraph may have a logical style attached to it
    which " +
    "contains the default attributes to use if not overridden
    by " +
    "attributes set on the paragraph or character run.
    Components " +
    "and images may be embedded in the flow of text." // 92 -
    321
    };
    textPane = new JTextPane();
    StyledDocument doc = textPane.getStyledDocument();
    createStyles(doc);
    setContent(doc, text);
    styleContent(doc);
    }

    private void createStyles(StyledDocument doc) {
    Style baseStyle = doc.addStyle("base", null);
    StyleConstants.setFontFamily(baseStyle, "Lucida Sans
    Unicode");
    StyleConstants.setFontSize(baseStyle, 18);
    StyleConstants.setFirstLineIndent(baseStyle, 20f);
    StyleConstants.setLeftIndent(baseStyle, 10f);

    Style style = doc.addStyle("bold", baseStyle);
    StyleConstants.setBold(style, true);

    style = doc.addStyle("italic", baseStyle);
    StyleConstants.setItalic(style, true);

    style = doc.addStyle("blue", baseStyle);
    StyleConstants.setForeground(style, Color.blue);

    style = doc.addStyle("underline", baseStyle);
    StyleConstants.setUnderline(style, true);

    style = doc.addStyle("green", baseStyle);
    StyleConstants.setForeground(style, Color.green.darker());
    StyleConstants.setUnderline(style, true);

    style = doc.addStyle("highlight", baseStyle);
    StyleConstants.setForeground(style, Color.yellow);
    StyleConstants.setBackground(style, Color.black);

    style = doc.addStyle("table", null);
    StyleConstants.setComponent(style, getTableComponent());

    style = doc.addStyle("tableParagraph", null);
    StyleConstants.setLeftIndent(style, 35f);
    StyleConstants.setRightIndent(style, 35f);
    StyleConstants.setSpaceAbove(style, 15f);
    StyleConstants.setSpaceBelow(style, 15f);
    }

    private void setContent(StyledDocument doc, String[] text) {
    try {
    doc.insertString(0, text[0], doc.getStyle
    ("base"));
    doc.insertString(doc.getLength(), text[1], doc.getStyle
    ("table"));
    doc.insertString(doc.getLength(), text[2], doc.getStyle
    ("base"));
    } catch(BadLocationException e) {
    System.out.printf("Bad location error: %s%n", e.getMessage
    ());
    }
    }

    private void styleContent(StyledDocument doc) {
    Style style = doc.getStyle("base");
    doc.setLogicalStyle(0, style);
    style = doc.getStyle("underline");
    doc.setCharacterAttributes(22, 10, style, false);
    style = doc.getStyle("highlight");
    doc.setCharacterAttributes(62, 26, style, false);

    Style logicalStyle = doc.getLogicalStyle(0);
    style = doc.getStyle("tableParagraph");
    doc.setParagraphAttributes(90, 1, style, false);
    style = doc.getStyle("table");
    doc.setCharacterAttributes(90, 1, style, false);
    doc.setLogicalStyle(92, logicalStyle);

    style = doc.getStyle("blue");
    doc.setCharacterAttributes(118, 13, style, false);
    style = doc.getStyle("italic");
    doc.setCharacterAttributes(166, 18, style, false);
    style = doc.getStyle("green");
    doc.setCharacterAttributes(235, 9, style, false);
    doc.setCharacterAttributes(248, 9, style, false);
    style = doc.getStyle("bold");
    doc.setCharacterAttributes(263, 10, style, false);
    doc.setCharacterAttributes(278, 6, style, false);
    }

    private JScrollPane getTableComponent() {
    JTable table = new JTable(getModel());
    Dimension d = table.getPreferredSize();
    d.width = 300;
    table.setPreferredScrollableViewportSize(d);
    return new JScrollPane(table);
    }

    private AbstractTableModel getModel() {
    return new AbstractTableModel() {
    public int getColumnCount() { return 3; }
    public int getRowCount() { return 3; }
    public Object getValueAt(int row, int col) {
    return String.valueOf(row + 1) + (col + 1);
    }
    };
    }

    private JScrollPane getContent() {
    return new JScrollPane(textPane);
    }

    public static void main(String[] args) {
    System.setProperty("swing.aatext", "true");
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setContentPane(new AddingTables().getContent());
    f.setSize(500,400);
    f.setLocation(200,200);
    f.setVisible(true);
    }
    }
     
    Ross, Oct 1, 2009
    #4
  5. Ross

    Ross Guest

    It seems that I have to use objects describe by the StyledDocument
    interface rather than Document. As I need to setLogicalAttributes()
    for the paragraphs to have their line indents set.

    It seems a bit of a clunky way of doing things, but it that's what I
    have to do......
     
    Ross, Oct 1, 2009
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Anno Siegel

    Re: read a paragraph via scrit?

    Anno Siegel, Apr 1, 2004, in forum: Perl
    Replies:
    0
    Views:
    476
    Anno Siegel
    Apr 1, 2004
  2. Jim Heavey

    Paragraph Name

    Jim Heavey, Dec 3, 2003, in forum: ASP .Net
    Replies:
    2
    Views:
    480
    Jim Heavey
    Dec 4, 2003
  3. MW de Jager

    HTML Paragraph question

    MW de Jager, Jul 6, 2005, in forum: ASP .Net
    Replies:
    9
    Views:
    487
    John Timney \(ASP.NET MVP\)
    Jul 6, 2005
  4. dorayme
    Replies:
    112
    Views:
    2,835
    dorayme
    Mar 30, 2009
  5. Tony
    Replies:
    2
    Views:
    323
Loading...

Share This Page