[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now

x
?
Solved

Using JComboBox with TableCellRenderer...

Posted on 1998-06-22
9
Medium Priority
?
1,571 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 100 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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 

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

On Demand Webinar: Networking for the Cloud Era

Did you know SD-WANs can improve network connectivity? Check out this webinar to learn how an SD-WAN simplified, one-click tool can help you migrate and manage data in the cloud.

Question has a verified solution.

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

By the end of 1980s, object oriented programming using languages like C++, Simula69 and ObjectPascal gained momentum. It looked like programmers finally found the perfect language. C++ successfully combined the object oriented principles of Simula w…
Introduction This article is the second of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers the basic installation and configuration of the test automation tools used by…
Viewers will learn about the different types of variables in Java and how to declare them. Decide the type of variable desired: Put the keyword corresponding to the type of variable in front of the variable name: Use the equal sign to assign a v…
Viewers will learn about the regular for loop in Java and how to use it. Definition: Break the for loop down into 3 parts: Syntax when using for loops: Example using a for loop:
Suggested Courses

656 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