Despite all the complexity and power Swing's text components provide, it's still pretty simple to do most things. Figure 19-1 shows each of the six Swing text components, plus an extra JTextArea (to show a different wrapping style) and an extra JEditorPane (to show a different EditorKit). // TextComponentSampler.java // import javax.swing.*; import javax.swing.text.*; import javax.swing.border.*; import java.awt.*; public class TextComponentSampler extends JFrame { public static String word = "portmeiron"; public static String markup = "Questions are <font size='+1' color='blue'>a burden</font> to others,\n" + "answers <font size='+2' color='red'>a prison</font> for oneself."; public TextComponentSampler( ) { super("TextComponentSampler"); JTextField tf = new JTextField(word, 12); JPasswordField pf = new JPasswordField(word, 12); MaskFormatter formatter = null; try { formatter = new MaskFormatter("UUUUU"); } catch (java.text.ParseException ex) { } JFormattedTextField ftf = new JFormattedTextField(formatter); ftf.setColumns(12); ftf.setValue(word); JTextArea ta1 = new JTextArea(markup); JScrollPane scroll1 = new JScrollPane(ta1); JTextArea ta2 = new JTextArea(markup); ta2.setLineWrap(true); ta2.setWrapStyleWord(true); JScrollPane scroll2 = new JScrollPane(ta2); JTextPane tp = new JTextPane( ); tp.setText(markup); // Create an AttributeSet with which to change color and font. SimpleAttributeSet attrs = new SimpleAttributeSet( ); StyleConstants.setForeground(attrs, Color.blue); StyleConstants.setFontFamily(attrs, "Serif"); // Apply the AttributeSet to a few blocks of text. StyledDocument sdoc = tp.getStyledDocument( ); sdoc.setCharacterAttributes(14, 29, attrs, false); sdoc.setCharacterAttributes(51, 7, attrs, false); sdoc.setCharacterAttributes(78, 28, attrs, false); sdoc.setCharacterAttributes(114, 7, attrs, false); JScrollPane scroll3 = new JScrollPane(tp); JEditorPane ep1 = new JEditorPane("text/plain", markup); JScrollPane scroll4 = new JScrollPane(ep1); JEditorPane ep2 = new JEditorPane("text/html", markup); JScrollPane scroll5 = new JScrollPane(ep2); // Done creating text components; now lay them out and make them pretty. JPanel panel_tf = new JPanel( ); JPanel panel_pf = new JPanel( ); JPanel panel_ftf = new JPanel( ); panel_tf.add(tf); panel_pf.add(pf); panel_ftf.add(ftf); panel_tf.setBorder(new TitledBorder("JTextField")); panel_pf.setBorder(new TitledBorder("JPasswordField")); panel_ftf.setBorder(new TitledBorder("JFormattedTextField")); scroll1.setBorder(new TitledBorder("JTextArea (line wrap off)")); scroll2.setBorder(new TitledBorder("JTextArea (line wrap on)")); scroll3.setBorder(new TitledBorder("JTextPane")); scroll4.setBorder(new TitledBorder("JEditorPane (text/plain)")); scroll5.setBorder(new TitledBorder("JEditorPane (text/html)")); JPanel pan = new JPanel(new FlowLayout(FlowLayout.LEFT)); pan.add(panel_tf); pan.add(panel_pf); pan.add(panel_ftf); Container contentPane = getContentPane( ); contentPane.setLayout(new GridLayout(2, 3, 8, 8)); contentPane.add(pan); contentPane.add(scroll1); contentPane.add(scroll2); contentPane.add(scroll3); contentPane.add(scroll4); contentPane.add(scroll5); } public static void main(String args[]) { JFrame frame = new TextComponentSampler( ); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(600, 450); frame.setVisible(true); } } Unlike java.awt.TextArea, the multiline Swing text components lack built-in scrollbars. If you want scrollbars and you almost always do you must create your own JScrollPane. Fortunately, this is easy to do. Just replace add(myTextComp) with add(new JScrollPane(myTextComp)). In most L&Fs, scrollbars do not appear unless they are needed. |