Java Swing How to - Create custom renderer for various font








Question

We would like to know how to create custom renderer for various font.

Answer

//from  ww  w .ja v  a2s  .co m
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Main {
  public static void main(String[] args) {
    JFrame frame = new ListRenderingFrame();
    frame.show();
  }

}

class FontCellRenderer implements ListCellRenderer {

  public Component getListCellRendererComponent(final JList list,
      final Object value, final int index, final boolean isSelected,
      final boolean cellHasFocus) {
    return new JPanel() {
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Font font = (Font) value;
        String text = font.getFamily();
        FontMetrics fm = g.getFontMetrics(font);
        g.setColor(isSelected ? list.getSelectionBackground() : list
            .getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(isSelected ? list.getSelectionForeground() : list
            .getForeground());
        g.setFont(font);
        g.drawString(text, 0, fm.getAscent());
      }

      public Dimension getPreferredSize() {
        Font font = (Font) value;
        String text = font.getFamily();
        Graphics g = getGraphics();
        FontMetrics fm = g.getFontMetrics(font);
        return new Dimension(fm.stringWidth(text), fm.getHeight());
      }
    };
  }

}

class ListRenderingFrame extends JFrame implements ListSelectionListener {
  JLabel label = new JLabel("The quick brown fox jumps over the lazy dog");

  public ListRenderingFrame() {
    setTitle("ListRendering");
    setSize(400, 300);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });

    Vector fonts = new Vector();
    fonts.add(new Font("Serif", Font.PLAIN, 8));
    fonts.add(new Font("SansSerif", Font.BOLD, 12));
    fonts.add(new Font("Monospaced", Font.PLAIN, 16));
    fonts.add(new Font("Dialog", Font.ITALIC, 12));
    fonts.add(new Font("DialogInput", Font.PLAIN, 12));
    JList fontList = new JList(fonts);
    fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    fontList.setCellRenderer(new FontCellRenderer());
    JScrollPane scrollPane = new JScrollPane(fontList);

    JPanel p = new JPanel();
    p.add(scrollPane);
    fontList.addListSelectionListener(this);

    getContentPane().add(p, "Center");

    getContentPane().add(label, "South");
  }

  public void valueChanged(ListSelectionEvent evt) {
    JList source = (JList) evt.getSource();
    Font font = (Font) source.getSelectedValue();
    label.setFont(font);
  }
}