Java Swing How to - Create formatted text to show in JTextPane








Question

We would like to know how to create formatted text to show in JTextPane.

Answer

import java.awt.BorderLayout;
import java.awt.Color;
//from  w  w  w  .  j av a  2  s  .co m
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;

public class Main extends JFrame {
  JPanel topPanel;
  JTextPane tPane;
  JTextField tfield = new JTextField();
  int counter = 0;
  Color[] colours = { Color.RED, Color.BLUE, };

  private void createAndDisplayGUI() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    tPane = new JTextPane();
    JScrollPane scroller = new JScrollPane();
    scroller.setViewportView(tPane);
  
    tfield.addActionListener(e->{
        counter++;
        if (counter == 8)
          counter = 0;
        String text = tfield.getText() + "\n";
        appendToPane(tPane, text, colours[counter]);
        tfield.selectAll();
    });

    getContentPane().add(scroller, BorderLayout.CENTER);
    getContentPane().add(tfield, BorderLayout.PAGE_END);

    setSize(200, 100);
    setVisible(true);
    tfield.requestFocusInWindow();
    tfield.setText("hi enter to start");
  }

  private void appendToPane(JTextPane tp, String msg, Color c) {
    StyleContext sc = StyleContext.getDefaultStyleContext();
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY,
        StyleConstants.Foreground, c);

    aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console");
    aset = sc.addAttribute(aset, StyleConstants.Alignment,
        StyleConstants.ALIGN_JUSTIFIED);

    int len = tp.getDocument().getLength();
    tp.setCaretPosition(len);
    tp.setCharacterAttributes(aset, false);
    tp.replaceSelection(msg);
  }

  public static void main(String... args) {
    new Main().createAndDisplayGUI();
  }
}