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)