Using JComboBox with TableCellRenderer...

I am using Swing's JTable, and I have also wrote a TableCellRenderer to use with the table.  I have one column
which I want to have JComboBox's in, rather than just JLabel's as the cells.  I can get the table to show up with the JComboBox's in each cell in that column, but it doesn't pull down to show the items in the JComboBox.  What could be the problem?  Has anyone experienced this before?  If so, what can I do to correct this?
stepmaAsked:
Who is Participating?
 
evijayCommented:
Please Go thru TableExample4.java in Swing  demo examples\Table package which comes with swing distribution.
TableExample4 has a feature of jcombo box being displayed as table cell and it uses its custom renderer which is an extension of DefaultTableCellRenderer

0
 
stepmaAuthor Commented:
I am doing all of the same things as they do in that example, because that is where I got the idea from.  It still doesn't work though.  Have you ever done this before?  
0
 
evijayCommented:
please send me the sample code


0
Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

 
stepmaAuthor Commented:
public class CSWSearchTableCellRenderer extends JLabel implements
                                                       TableCellRenderer
{
    public CSWSearchTableCellRenderer()
    {
        super();
        setOpaque(true);
    }

    /**
     * Implement TableCellRenderer
     */
    public Component getTableCellRendererComponent(JTable table, Object value,
                          boolean isSelected, boolean hasFocus, int row, int column)
    {
          if (isSelected)
        {
            setForeground(SystemColor.textHighlightText);
            setBackground(SystemColor.textHighlight);
        }
        else
        {
            setBackground(table.getBackground());
            setForeground(table.getForeground());
        }
          setFont(table.getFont());

          if (value instanceof Member)
          {
              Member member = (Member)value;
              CustomerMember cm[] = member.getCustomerMembers();
              switch(column)
              {
                  case ID:
                      setText(cm[0].getId());
                      break;
                  case LAST:
                      setText(member.getLastName());
                      break;
                  case FIRST:
                      setText(member.getFirstName());
                      break;
                  case DOB:
                      setText(member.getDateOfBirth());
                      break;
                  case CITY:
                      setText(member.getCity());
                      break;
                  case STATE:
                      setText(member.getState());
                      break;
                  case EMPLOYER:
                      
                      JComboBox combo = new JComboBox();
                      combo.setFont(table.getFont());
                      combo.setEditable(false);
                      combo.setLightWeightPopupEnabled(true);
                      for (int i = 0; i < cm.length; i++)
                      {
                          String empName = cm[i].getCustomerName().trim();
                          if (empName.length() > 0)
                              combo.addItem(empName);  
                      }
                      TableColumn col = table.getColumn("Employer");
                      return combo;
              }
          }

          return this;
    }
   
    /* Column constants */
    private static final int    ID = 0,
                                LAST = 1,
                                FIRST = 2,
                                DOB = 3,
                                CITY = 4,
                                STATE = 5,
                                EMPLOYER = 6;
}

0
 
evijayCommented:
replace

public class CSWSearchTableCellRenderer extends JLabel implements
                                                                    TableCellRenderer
             {

with

public class CSWSearchTableCellRenderer extends DefaultTableCellRenderer
             {


Please go thru the DefaultTableCellRenderer code and see what you are not doing in your cell renderer


0
 
stepmaAuthor Commented:
I tried this, and it didn't behave any differently.  What else ?
0
 
evijayCommented:
Hi,

There are two things

DefaultCellRenderer and DefaultCellEditor

You must use DefaultTableCellEditor to set the Combo Box. Not the DefaultTableCellRenderer.
You can override both the DefaultTableCellEditor as well as DefaultTableCellRenderer and provide two different components - one for TableCellEditor and one for TableCellRenderer.

Your program is not working since, As soon as you click on the cell with JComboBox, it gets replaced by the DefaultTableCellEditor which is not JComboBox in this case(since you didnt provide one). Thus, you need to implement TableCellEditor  interface and set the DefaultTableCellEditor too.

I will provide with an example as soon as possible.

Vijay

0
 
stepmaAuthor Commented:
ok
0
 
evijayCommented:
Actually, I have to implement  both TableCellEditor and TableCellRenderer interfaces in CSWSearchTableCellRendererEditor class but i am lazy and hence just extended DefaultTableCellEditor and implemented TableCellRenderer interface. The code which is required to meet your needs will be much different from this.
I just has very less time to do this.
You should have a seperate MyTableCellEditor and MyTableCellRenderer which implements TableCellEditor and TableCellRenderer interfaces and set these appropriately to JTable using setTableCellEditor and setTableCellRenderer.

Go thru DefaultCellEditor to know how to implement your own MyTableCellEditor. Please free to ask more doubts if you have any. Sorry for keeping you waiting this much time (i didnt have time to do it) and not rejecting the answer.

I lifted this TableExample4 and tweaked it.


TableExam.java --->


import java.awt.*;
import com.sun.java.swing.*;
import com.sun.java.swing.table.*;
import com.sun.java.swing.border.*;

import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Color;

class CSWSearchTableCellRendererEditor  extends DefaultCellEditor
                                          implements TableCellRenderer
                                                           
{

            CSWSearchTableCellRendererEditor(JComboBox combo)
            {
                  super(combo);
                  
            }

                 /**
                  * Implement TableCellRenderer
                  */
                  public Component getTableCellRendererComponent(JTable table,
                                                         Object value,
                                                         boolean isSelected,
                                                         boolean hasFocus,
                                                         int row,
                                                         int column)          
                  {                
                              JComboBox combo = new JComboBox();
                              combo.removeAllItems();
                              combo.addItem("Red");
                              combo.addItem("Green");
                              combo.addItem("Blue");                              
                              return (Component) combo;
                     
                  }
                 /**
                  * Implement TableCellEditor
                  */
                 public Component getTableCellEditorComponent(JTable table,
                                                       Object value,
                                                       boolean isSelected,
                                                       int row,
                                                       int column)
                 {
                              JComboBox combo = new JComboBox();
                              combo.removeAllItems();
                               combo.addItem("Red");
                              combo.addItem("Green");
                              combo.addItem("Blue");                              
                              return (Component) combo;
                     
                  }

}



public class TableExam {

    public TableExam() {
        JFrame frame = new JFrame("Table");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {System.exit(0);}});

        // Take the dummy data from SwingSet.  
        final String[] names = {"First Name", "Last Name", "Favorite Color",
                                "Favorite Number", "Vegetarian"};
        final Object[][] data = {
          {"Mark", "Andrews", "Red", new Integer(2), new Boolean(true)},
          {"Tom", "Ball", "Blue", new Integer(99), new Boolean(false)},
          {"Alan", "Chung", "Green", new Integer(838), new Boolean(false)},
          {"Jeff", "Dinkins", "Turquois", new Integer(8), new Boolean(true)},
          {"Amy", "Fowler", "Yellow", new Integer(3), new Boolean(false)},
          {"Brian", "Gerhold", "Green", new Integer(0), new Boolean(false)},
          {"James", "Gosling", "Pink", new Integer(21), new Boolean(false)},
          {"David", "Karlton", "Red", new Integer(1), new Boolean(false)},
          {"Dave", "Kloba", "Yellow", new Integer(14), new Boolean(false)},
          {"Peter", "Korn", "Purple", new Integer(12), new Boolean(false)},
          {"Phil", "Milne", "Purple", new Integer(3), new Boolean(false)},
          {"Dave", "Moore", "Green", new Integer(88), new Boolean(false)},
          {"Hans", "Muller", "Maroon", new Integer(5), new Boolean(false)},
          {"Rick", "Levenson", "Blue", new Integer(2), new Boolean(false)},
          {"Tim", "Prinzing", "Blue", new Integer(22), new Boolean(false)},
          {"Chester", "Rose", "Black", new Integer(0), new Boolean(false)},
          {"Ray", "Ryan", "Gray", new Integer(77), new Boolean(false)},
          {"Georges", "Saab", "Red", new Integer(4), new Boolean(false)},
          {"Willie", "Walker", "Phthalo Blue", new Integer(4), new Boolean(false)},
          {"Kathy", "Walrath", "Blue", new Integer(8), new Boolean(false)},
          {"Arnaud", "Weber", "Green", new Integer(44), new Boolean(false)}
        };

        // Create a model of the data.
        TableModel dataModel = new AbstractTableModel() {
            // These methods always need to be implemented.
            public int getColumnCount() { return names.length; }
            public int getRowCount() { return data.length;}
            public Object getValueAt(int row, int col) {return data[row][col];}

            // The default implementations of these methods in
            // AbstractTableModel would work, but we can refine them.
            public String getColumnName(int column) {return names[column];}
            public Class getColumnClass(int c) {return getValueAt(0, c).getClass();}
            public boolean isCellEditable(int row, int col) {return true;}
            public void setValueAt(Object aValue, int row, int column) {
                System.out.println("Setting value to: " + aValue);
                data[row][column] = aValue;
            }
         };
 
        // Create the table
        JTable tableView = new JTable(dataModel);  

      // Create a combo box to show that you can use one in a table.
      JComboBox comboBox = new JComboBox();
      comboBox.addItem("Red");
      comboBox.addItem("Orange");
      comboBox.addItem("Yellow");
      comboBox.addItem("Green");
      comboBox.addItem("Blue");
      comboBox.addItem("Indigo");
      comboBox.addItem("Violet");

// .5       TableColumn colorColumn = tableView.getColumn(new Integer(3));
        TableColumn colorColumn = tableView.getColumn("Favorite Color");
       
        // Set a pink background and tooltip for the Color column renderer.
        CSWSearchTableCellRendererEditor tcre =
                  new CSWSearchTableCellRendererEditor(new JComboBox());
        colorColumn.setCellRenderer(tcre);
        colorColumn.setCellEditor(tcre);
       
        // Set a tooltip for the header of the colors column.
      TableCellRenderer headerRenderer = colorColumn.getHeaderRenderer();
      if (headerRenderer instanceof DefaultTableCellRenderer)
          ((DefaultTableCellRenderer)headerRenderer).setToolTipText("Hi Mom!");

      // Set the width of the "Vegetarian" column.
        TableColumn vegetarianColumn = tableView.getColumn("Vegetarian");
        vegetarianColumn.setWidth(35);

      // Show the values in the "Favorite Number" column in different colors.
        TableColumn numbersColumn = tableView.getColumn("Favorite Number");

        DefaultTableCellRenderer numberColumnRenderer = new DefaultTableCellRenderer() {
          public void setValue(Object value) {
              int cellValue = (value instanceof Number) ? ((Number)value).intValue() : 0;
              setForeground((cellValue > 30) ? Color.black : Color.red);
              setText((value == null) ? "" : value.toString());
          }
        };
        numberColumnRenderer.setHorizontalAlignment(JLabel.RIGHT);
        numbersColumn.setCellRenderer(numberColumnRenderer);

        // Finish setting up the table.
        JScrollPane scrollpane = JTable.createScrollPaneForTable(tableView);
      scrollpane.setBorder(new BevelBorder(BevelBorder.LOWERED));
        scrollpane.setPreferredSize(new Dimension(700, 300));
        frame.getContentPane().add(scrollpane);
        frame.pack();
        frame.setVisible(true);
    }
   
    public static void main(String[] args) {
        new TableExam();
    }
}


0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.