Solved

Using JComboBox with TableCellRenderer...

Posted on 1998-06-22
9
1,518 Views
Last Modified: 2009-12-16
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?
0
Comment
Question by:stepma
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 4
9 Comments
 
LVL 4

Accepted Solution

by:
evijay earned 50 total points
ID: 1223479
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
 

Author Comment

by:stepma
ID: 1223480
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
 
LVL 4

Expert Comment

by:evijay
ID: 1223481
please send me the sample code


0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:stepma
ID: 1223482
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
 
LVL 4

Expert Comment

by:evijay
ID: 1223483
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
 

Author Comment

by:stepma
ID: 1223484
I tried this, and it didn't behave any differently.  What else ?
0
 
LVL 4

Expert Comment

by:evijay
ID: 1223485
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
 

Author Comment

by:stepma
ID: 1223486
ok
0
 
LVL 4

Expert Comment

by:evijay
ID: 1223487
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

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Oracle SQL syntax check  without executing 6 109
servlet and mdb, jms error 1 57
What is the use of Forwarding Class in java 1 37
netbeans can not run self signed app 8 15
Java had always been an easily readable and understandable language.  Some relatively recent changes in the language seem to be changing this pretty fast, and anyone that had not seen any Java code for the last 5 years will possibly have issues unde…
Introduction This article is the first of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article explains our test automation goals. Then rationale is given for the tools we use to a…
Viewers learn about the “while” loop and how to utilize it correctly in Java. Additionally, viewers begin exploring how to include conditional statements within a while loop and avoid an endless loop. Define While Loop: Basic Example: Explanatio…
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…

696 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question