Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Paragraph properties with RTF

Reply
Thread Tools

Paragraph properties with RTF

 
 
Ross
Guest
Posts: n/a
 
      10-01-2009
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 );
}
}
 
Reply With Quote
 
 
 
 
Roedy Green
Guest
Posts: n/a
 
      10-01-2009
On Thu, 1 Oct 2009 14:35:25 -0700 (PDT), Ross <(E-Mail Removed)>
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)
 
Reply With Quote
 
 
 
 
Ross
Guest
Posts: n/a
 
      10-01-2009
On Oct 1, 10:37 pm, Roedy Green <(E-Mail Removed)>
wrote:
> On Thu, 1 Oct 2009 14:35:25 -0700 (PDT), Ross <(E-Mail Removed)>
> 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.
 
Reply With Quote
 
Ross
Guest
Posts: n/a
 
      10-01-2009
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...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, 1;
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);
}
}
 
Reply With Quote
 
Ross
Guest
Posts: n/a
 
      10-01-2009
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......
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: what do you think on my summary on C, for 13-15 years studentin .rtf format [to cut and paste in a .rtf file] Kleuskes & Moos C Programming 8 10-13-2011 08:51 AM
Why choose a paragraph element for a paragraph? dorayme HTML 112 03-30-2009 10:56 PM
Re: read a paragraph via scrit? Anno Siegel Perl 0 04-01-2004 01:25 PM
Paragraph Name Jim Heavey ASP .Net 2 12-04-2003 05:00 PM
Doing a 'mail merge' with RTF files (aka RTF templates) Tony Perl Misc 2 08-27-2003 08:12 AM



Advertisments