HomeComputer programmingJava programmingJava: Multi-Column JList (swing)

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


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




Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments

Cleveland Furia on How to Clear Google Activity
Sid Wohlfarth on How to Clear Google Activity
Riley Magsayo on How to Clear Google Activity
สมัครรับเครดิตฟรี ทันที on How to improve Remote Desktop Protocol Performance
Neal Wangstad on How to Clear Google Activity
Slavcho Andov on How to install Ubuntu
Slavcho Andov on How to fix bad sectors
Sheraz Ali on How to Backup Android