Solved

Using JComboBox with TableCellRenderer...

Posted on 1998-06-22
9
1,530 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
The Ultimate Checklist to Optimize Your Website

Websites are getting bigger and complicated by the day. Video, images, custom fonts are all great for showcasing your product/service. But the price to pay in terms of reduced page load times and ultimately, decreased sales, can lead to some difficult decisions about what to cut.

 

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

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!

Question has a verified solution.

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

INTRODUCTION Working with files is a moderately common task in Java.  For most projects hard coding the file names, using parameters in configuration files, or using command-line arguments is sufficient.   However, when your application has vi…
For beginner Java programmers or at least those new to the Eclipse IDE, the following tutorial will show some (four) ways in which you can import your Java projects to your Eclipse workbench. Introduction While learning Java can be done with…
Video by: Michael
Viewers learn about how to reduce the potential repetitiveness of coding in main by developing methods to perform specific tasks for their program. Additionally, objects are introduced for the purpose of learning how to call methods in Java. Define …
Viewers learn about the scanner class in this video and are introduced to receiving user input for their programs. Additionally, objects, conditional statements, and loops are used to help reinforce the concepts. Introduce Scanner class: Importing…

688 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