Prev: function tog() {
Next: Non destructive read of socket
From: Ross on 1 Oct 2009 17:35 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 ); } }
From: Roedy Green on 1 Oct 2009 17:37 On Thu, 1 Oct 2009 14:35:25 -0700 (PDT), Ross <rossclement(a)gmail.com> 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)
From: Ross on 1 Oct 2009 17:40 On Oct 1, 10:37 pm, Roedy Green <see_webs...(a)mindprod.com.invalid> wrote: > On Thu, 1 Oct 2009 14:35:25 -0700 (PDT), Ross <rossclem...(a)gmail.com> > 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.
From: Ross on 1 Oct 2009 18:03 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); } }
From: Ross on 1 Oct 2009 18:54
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...... |