Java tutorial
import java.awt.BorderLayout; import java.awt.Component; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.StringTokenizer; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; public class TabRenendererList extends JFrame { protected JList list; public TabRenendererList() { super("Swing List with Tab Renenderer"); setSize(500, 240); String[] items = { "cloumn 1\t column 2\t Column 3", "cloumn 1\t column 2\t Column 3" }; list = new JList(items); TabListCellRenderer renderer = new TabListCellRenderer(); list.setCellRenderer(renderer); JScrollPane scrollPane = new JScrollPane(); scrollPane.getViewport().add(list); getContentPane().add(scrollPane, BorderLayout.CENTER); WindowListener exitEvent = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; addWindowListener(exitEvent); setVisible(true); } public static void main(String argv[]) { new TabRenendererList(); } } class TabListCellRenderer extends JLabel implements ListCellRenderer { protected static Border m_noFocusBorder = new EmptyBorder(1, 1, 1, 1); protected FontMetrics m_fm = null; public TabListCellRenderer() { super(); setOpaque(true); setBorder(m_noFocusBorder); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { setText(value.toString()); setBackground(isSelected ? list.getSelectionBackground() : list.getBackground()); setForeground(isSelected ? list.getSelectionForeground() : list.getForeground()); setFont(list.getFont()); setBorder((cellHasFocus) ? UIManager.getBorder("List.focusCellHighlightBorder") : m_noFocusBorder); return this; } public void paint(Graphics g) { m_fm = g.getFontMetrics(); g.setColor(getBackground()); g.fillRect(0, 0, getWidth(), getHeight()); getBorder().paintBorder(this, g, 0, 0, getWidth(), getHeight()); g.setColor(getForeground()); g.setFont(getFont()); Insets insets = getInsets(); int x = insets.left; int y = insets.top + m_fm.getAscent(); StringTokenizer st = new StringTokenizer(getText(), "\t"); while (st.hasMoreTokens()) { String str = st.nextToken(); g.drawString(str, x, y); //insert distance for each tab x += m_fm.stringWidth(str) + 50; if (!st.hasMoreTokens()) break; } } }