Warning: Invalid argument supplied for foreach() in /home/techrecipes/public_html/wp-content/themes/techrecipes/header.php on line 77

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: [email protected]
-William. § (marvin_gohan)

The Conversation

Follow the reactions below and share your own thoughts.

  • dog tags for dogs

    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.

  • dog tags for dogs

    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

  • Rajeenapc

    it doesnt work bu, i tried…

  • Brairtoss87

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

  • ALex

    What about selected items in a list?

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

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