Java: Multi-Column JList (swing)

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.)

CODE EXAMPLE:

import java.io.*;
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
addElements();
//set list for JList
list.setListData(columnData);
//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: william_a_wilson@hotmail.com
-William. § (marvin_gohan)

The Conversation

Follow the reactions below and share your own thoughts.

5 Responses to “Java: Multi-Column JList (swing)”

  1. November 13, 2010 at 12:28 am, dog tags for dogs said:

    I just want to let you know that I just check out your site and I find it very interesting and informative. I can’t wait to read lots of your posts.

    Reply

  2. November 18, 2010 at 3:13 am, dog tags for dogs said:

    I visited your blog for the first time and just been your fan. Keep posting as I am gonna come to read it everyday.thank you for your post

    Reply

  3. March 02, 2011 at 9:31 am, Rajeenapc said:

    it doesnt work bu, i tried…

    Reply

  4. August 02, 2011 at 1:19 am, Brairtoss87 said:

    Useful info. Hope to see more good posts in the future.

    Reply

  5. October 03, 2011 at 8:46 am, ALex said:

    What about selected items in a list?

    System.out.println(list.getSelectedValue());

    output:
    [Ljava.lang.String;@1cec6b00

    Reply

Leave a Reply

You may also like-

iTunes: Sort by Dated Added or Purchase DateiTunes: Sort by Dated Added or Purchase DateMany users like to sort their iTunes content by when it was purchased or added to the library. In iTunes 11 these sorting options ... Java: Null Layout Manager (swing)Java: Null Layout Manager (swing)how to use the Null Layout Manager Layout Managers are used in the orginization of Panels and Frames. The proper layout should be chosen ...