Solved

Using JComboBox with TableCellRenderer...

Posted on 1998-06-22
9
1,484 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
  • 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
 

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
Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

 
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

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

For customizing the look of your lightweight component and making it look opaque like it was made of plastic.  This tip assumes your component to be of rectangular shape and completely opaque.   (CODE)
Java Flight Recorder and Java Mission Control together create a complete tool chain to continuously collect low level and detailed runtime information enabling after-the-fact incident analysis. Java Flight Recorder is a profiling and event collectio…
Viewers will learn one way to get user input in Java. Introduce the Scanner object: Declare the variable that stores the user input: An example prompting the user for input: Methods you need to invoke in order to properly get  user input:
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.

708 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

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now