Techno World Inc - The Best Technical Encyclopedia Online!

THE TECHNO CLUB [ TECHNOWORLDINC.COM ] => JAVA => Topic started by: Admin on January 01, 2007, 02:20:09 AM



Title: Java: Multi-Column JList (swing)
Post by: Admin on January 01, 2007, 02:20:09 AM
Ever wanted an aligned multi-column JList that allowed all columns to be selected as a single entry? Here's how.

*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 3 columns, to add or remove is a simple editing job, as i'm 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 will more specifically a listcellrenderer and will implement JLabels for the entries of each column.
(Do not worry, the labels will not be grey)

CODE EXAMPLE:

Code:
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 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 is the columns are elements in a 2D array, the list selection needs to be set, and then apply the cell renderer, and it uses this list selection to create the list.