Java: Multi-Column JList (swing)

Posted February 27, 2006 by William_Wilson in Java programming

Have you ever wanted an aligned, multi-column JList that allowed all columns to be selected as a single entry? Keep reading to find out how to create one.

*Note: The column size will automatically become the size of the longest string or largest picture, etc.

This example will show how to construct a JList with three columns. To add or remove is a simple editing job, as I am sure you will notice the pattern in the code.

To approach this, we will need a CellRenderer, since the setup of this particular method will not change. It merely displays the components as we describe. This method will be static.

The CellRenderer is more specifically a listcellrenderer and will implement JLabels for the entries of each column.
(Do not worry. The labels will not be gray.)


import java.awt.*;
import java.util.*;
import java.text.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;

public class MultiColumn{

JFrame jf;
JScrollPane scroll;
JList list;
String[][] columnData;

public MultiColumn(){
//create the frame and JList JPanel
jf = new aFrame();
//create element List array
//set list for JList
//create Renderer and dislpay
list.setCellRenderer(new MyCellRenderer());

public void addElements(){
//first number is number of rows, second is number of columns
columnData = new String[4][3];
//static setting of String[][]
columnData[0][0] = "William";
columnData[0][1] = "A";
columnData[0][2] = "Wilson";
//dynamic setting of String[][]
for(int i=1;i<4;i++){ columnData[i][0] = "William"; columnData[i][1] = String.valueOf(i*13); Calendar c = new GregorianCalendar(); columnData[i][2] = ((Date)c.getTime()).toString(); } } public class aFrame extends JFrame{ public aFrame(){ super("Multi-Column JList Example"); getContentPane().add(new PanelBuilder()); // display rules setResizable(true); setLocation(250,50); setBackground(Color.lightGray); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(650, 400); setVisible(true); } private class PanelBuilder extends JPanel{ public PanelBuilder(){ GridBagLayout layout = new GridBagLayout(); GridBagConstraints layoutConstraints = new GridBagConstraints(); setLayout(layout); scroll = new JScrollPane(); list = new JList(); layoutConstraints.gridx = 0; layoutConstraints.gridy = 0; layoutConstraints.gridwidth = 1; layoutConstraints.gridheight = 1; layoutConstraints.fill = GridBagConstraints.BOTH; layoutConstraints.insets = new Insets(1, 1, 1, 1); layoutConstraints.anchor = GridBagConstraints.CENTER; layoutConstraints.weightx = 1.0; layoutConstraints.weighty = 1.0; scroll = new JScrollPane(list,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane. HORIZONTAL_SCROLLBAR_NEVER); layout.setConstraints(scroll, layoutConstraints); add(scroll); } } } static class MyCellRenderer extends JPanel implements ListCellRenderer{ JLabel left, middle, right; MyCellRenderer() { setLayout(new GridLayout(1, 3)); left = new JLabel(); middle = new JLabel(); right = new JLabel(); left.setOpaque(true); middle.setOpaque(true); right.setOpaque(true); add(left); add(middle); add(right); } public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus){ String leftData = ((String[])value)[0]; String middleData = ((String[])value)[1]; String rightData = ((String[])value)[2]; left.setText(leftData); middle.setText(middleData); right.setText(rightData); if(isSelected){ left.setBackground(list.getSelectionBackground()); left.setForeground(list.getSelectionForeground()); middle.setBackground(list.getSelectionBackground()); middle.setForeground(list.getSelectionForeground()); right.setBackground(list.getSelectionBackground()); right.setForeground(list.getSelectionForeground()); } else{ left.setBackground(list.getBackground()); left.setForeground(list.getForeground()); middle.setBackground(list.getBackground()); middle.setForeground(list.getForeground()); right.setBackground(list.getBackground()); right.setForeground(list.getForeground()); } setEnabled(list.isEnabled()); setFont(list.getFont()); return this; } } public static void main(String args[]){ MultiColumn jf = new MultiColumn(); } }

*NOTE: All the imports are not necessary, but the odds are, in a program using such a setup, you will need them anyway.

Hopefully, this code is clear, but the main things to understand are the columns are elements in a 2-D array, the list selection needs to be set, and then apply the cell renderer. It uses this list selection to create the list.

Questions/Comments: [email protected]
-William. ยง (marvin_gohan)

The Conversation

Follow the reactions below and share your own thoughts.