Adding button to a custom table cell (and handling them)

Hi
I'm wondering if it's possible to add a button on each row of a table view using a custom table cell view. If it's possible, I'm really wondering how I can handle the click events on these buttons.
Thanks

No.
Try creating a view and adding it to a cell. Let us know what problems you have, and we can try to help.

Similar Messages

  • Custom table cell

    hi
    in my project i created some custom-table-cell (classes) manually without interface builder.
    now my question is; is it possible to create custom-table-cells with interface builder for dynamicly create instances?
    i would like to have a nib file where a customtablecell is placed and defined which i can later create instances from.
    i have no idea how i can do this.
    thanks.

    Make a XIB where the File's owner is a UIViewController and the only other thing in it is your custom table cell and it is hooked up to the file's owner as the view. Then you can do:
    UIViewController* c = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];
    cell = (CustomCell *)c.view;

  • Small issue with custom table cell editor and unwanted table row selection

    I'm using a custom table cell editor to display a JTree. Thing i notice is that when i select a value in the tree pop-up, the pop-up closes (as it should) but then every table row, from the editing row to the row behind the pop-up when i selected the value becomes highlighted. I'm thinking this is a focus issue, but it thought i took care of that. To clairfy, look at this: Before . Notice how the "Straightening" tree item is roughly above the "Stock Thickness" table row? When i select Straightening, this is what happens to my table: After .
    My TreeComboBox component:
    public class TreeComboBox extends JPanel implements MouseListener {
        private JTextField itemField;
        private TreeModel treeModel;
        private ArrayList<ActionListener> actionListeners = new ArrayList<ActionListener>();
        private Object selectedItem;
         * Creates a new <code>TreeComboBox</code> instance.
         * @param treeModel the tree model to be used in the drop-down selector.
        public TreeComboBox(TreeModel treeModel) {
            this(treeModel, null);
         * Creates a new <code>TreeComboBox</code> instance.
         * @param treeModel the tree model to be used in the drop-down selector.
         * @param selectedItem tree will expand and highlight this item.
        public TreeComboBox(TreeModel treeModel, Object selectedItem) {
            this.treeModel = treeModel;
            this.selectedItem = selectedItem;
            initComponents();
         * Returns the current drop-down tree model.
         * @return the current <code>TreeModel</code> instance.
        public TreeModel getTreeModel() {
            return treeModel;
         * Sets the tree model.
         * @param treeModel a <code>TreeModel</code> instance.
        public void setTreeModel(TreeModel treeModel) {
            this.treeModel = treeModel;
         * Returns the selected item from the drop-down selector.
         * @return the selected tree object.
        public Object getSelectedItem() {
            return selectedItem;
         * Sets the selected item in the drop-down selector.
         * @param selectedItem tree will expand and highlight this item.
        public void setSelectedItem(Object selectedItem) {
            this.selectedItem = selectedItem;
            String text = selectedItem != null ? selectedItem.toString() : "";
            itemField.setText(text);
            setToolTipText(text);
         * Overridden to enable/disable all child components.
         * @param enabled flat to enable or disable this component.
        public void setEnabled(boolean enabled) {
            itemField.setEnabled(enabled);
            super.setEnabled(enabled);
        public void addActionListener(ActionListener listener) {
            actionListeners.add(listener);
        public void removeActionListener(ActionListener listener) {
            actionListeners.remove(listener);
        // MouseListener implementation
        public void mouseClicked(MouseEvent e) {
        public void mouseEntered(MouseEvent e) {
        public void mouseExited(MouseEvent e) {
        public void mousePressed(MouseEvent e) {
        public void mouseReleased(MouseEvent e) {
            showPopup();
        private void initComponents() {
            setLayout(new GridBagLayout());
            itemField = new JTextField();
            itemField.setEditable(false);
            itemField.setText(selectedItem != null ? selectedItem.toString() : "");
            itemField.addMouseListener(this);
            add(itemField, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0,
                    GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
        private void showPopup() {
            final TreePopup popup = new TreePopup();
            final TreeComboBox tcb = this;
            final int x = itemField.getX();
            final int y = itemField.getY() + itemField.getHeight();
            int width = itemField.getWidth() + popupButton.getWidth();
            Dimension prefSize = popup.getPreferredSize();
            prefSize.width = width;
            popup.setPreferredSize(prefSize);
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    popup.show(tcb, x, y);
                    popup.requestFocusInWindow();
        private void fireActionPerformed() {
            ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "TreeComboBoxSelection");
            for (ActionListener listener : actionListeners) {
                listener.actionPerformed(e);
        private class TreePopup extends JPopupMenu {
            private JTree tree;
            private JScrollPane scrollPane;
            public TreePopup() {
                initComponents();
                initData();
            private void initData() {
                if (treeModel != null) {
                    tree.setModel(treeModel);
            private void initComponents() {
                setFocusable(true);
                setFocusCycleRoot(true);
                tree = new JTree();
                tree.setRootVisible(false);
                tree.setShowsRootHandles(true);
                tree.setFocusable(true);
                tree.setFocusCycleRoot(true);
                tree.addTreeSelectionListener(new TreeSelectionListener() {
                    public void valueChanged(TreeSelectionEvent e) {
                        tree_valueChanged(e);
                scrollPane = new JScrollPane(tree);
                add(scrollPane);
            private void tree_valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
                setSelectedItem(node.getUserObject());
                fireActionPerformed();
                this.setVisible(false);
    }My TreeComboBoxTableCellEditor:
    public class TreeComboBoxTableCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
        protected TreeComboBox treeComboBox;
        protected ArrayList<CellEditorListener> cellEditorListeners = new ArrayList<CellEditorListener>();
        public TreeComboBoxTableCellEditor(TreeComboBox treeComboBox) {
            this.treeComboBox = treeComboBox;
            treeComboBox.addActionListener(this);
        public Object getCellEditorValue() {
            return treeComboBox.getSelectedItem();
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            treeComboBox.setSelectedItem(value);
            return treeComboBox;
        public void actionPerformed(ActionEvent e) {
            stopCellEditing();
    }Any thoughts?
    Edited by: MiseryMachine on Apr 3, 2008 1:21 PM
    Edited by: MiseryMachine on Apr 3, 2008 1:27 PM

    As I said, you have to have empty context elements before additional rows will be open for input.
    For instance if you want to start with 5 rows available for input do the following to your internal table that you will bind:
    data itab type standard table of sflight.
    do 5 times.
      append initial line to itab.
    enddo.
    context_node->bind_table( itab ).
    The other option if you need n number of rows is to add a button to the table toolbar for adding more rows. When this button is pressed, you add a new context element to the node - thereby creating a new empty row in the table.

  • How do you do custom table cell in IB?

    I want to avoid writing those custom table cells because its really a hassle. I see that in IB there are all the controls I need to make the cell (label, sliders etc) and there is even a table view, but I just cant figure out how to create that cell with all the controls in it and attach that cell to a tableview. They dont seem to integrate well in IB at all! Any one with any ideas?

    I'm a car dealer and I created the bill of sale for my dealership in a Numbers spread sheet. I want to be able to use my iPad mini w retina for customers to sign directly on my iPad then print out the BoS with signatures on it so I can make transactions easier for my customers in case I have to meet them somewhere instead of my office. Then I would have the ability to send them another copy if they happen to lose theirs without digging thru my files to find the hard copy and scan and send it to them.
    Thanks

  • Custom table cell renderer in a JTable is not called

    Hello, all,
    I have the following task: I need to select several cells in a column, change the value of those cells, and once the value changes, the color of these cells should change as well. I wrote a custom cell renderer, and registered it for the object type that will use it to render the cell. However, the custom cell renderer is never called. Instead, the class name of the object is displayed in the cell.
    My code snippents are as follows:
    //Declare the table and add custom cell renderer
    JTable table = new JTable (7,7);
    table.setCellSelectionEnabled (true);
    table.setSelectionMode (ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    //Add the custom cell renderer to render objects of type Item
    table.setDefaultRenderer(Item.class, new CustomTableCellRenderer());
    //Get the selected cells and change the object type in those cells
    //This part works, since I see the app entering the for loop in the debugger, and the item.toString() value is displayed in each selected cell
    int rowIndexStart = table.getSelectedRow();
    int rowIndexEnd = table.getSelectionModel().getMaxSelectionIndex();
    int colIndex = table.getSelectedColumn();
    Item item = new Item ();
    for (int i = rowIndexStart; i<=rowIndexEnd; i++){
                  table.setValueAt(item, i, colIndex);
                 //I expect the cell to redraw now using custom cell renderer defined below, but that cell render is never called.  Instead, the item.toString() value is displayed in the cell.   What is wrong?
    //Definition of custom cell renderer. 
    //the getTableCellRendererComponent is never called, since the System.out.println never prints.  I expected this method to be called as soon as the Item object is added to the cell.  Am I wrong in expecting that?
    class CustomTableCellRenderer extends DefaultTableCellRenderer  {
        public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component cell = super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
            System.out.println("value: "+value.getClass()+" isSelected "+isSelected+" hasFocus "+hasFocus+" row "+row+" col "+column);
            if (this.isFocusOwner()) {
            cell.setBackground( Color.red );
            cell.setForeground( Color.white );
            return cell;
    } Please, help,
    Thank you!
    Elana

    The suggestion given above assumes that all the data in a given column is of the same type.
    If you have different types of data in different rows the you should be overriding the getCellRenderer(...) method. Something like:
    public TableCellRenderer getCellRenderer(int row, int column)
        Object o = getValueAt(row, column);
        if (o instanceof Item)
            return yourCustomRenderer
        else
            return super.getCellRenderer(row, column);
    }

  • Adding a link to a table cell question

    ho can i add a link into a cell containing an image without increasing its size?
    I am trying to make a link out of a table cell containing an image.
    the problem is that the highlight frame around the image increases the size of the cell (and i cant have this since i imported all the small table images from photoshop wich constitute a big image).

    no i am just exporting fragmented gif images from photoshop that i want to assemble again in dreamweaver through a table.
    when i apply the link to one of the cells, dreamweaver increases its size (by 1 or 2 pixels) wich causes border gaps between cells and i cant have that.
    i am using this cell as a button. all i want is to apply a link to a cell containing an image without modifying its size.
    here's the code :
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
    <style type="text/css">
    body {
        background-color: #000;
    a:link {
        text-decoration: none;
    a:visited {
        text-decoration: none;
        color: #03C;
    a:hover {
        text-decoration: none;
        color: #F96;
    a:active {
        text-decoration: none;
        color: #969;
    a {
        font-size: 0px;
    </style>
    </head>
    <body>
    <table width="1280" border="0" align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td width="309"><img src="HomeImages/Home_01.gif" width="309" height="221" /></td>
        <td width="110"><img src="HomeImages/Home_02.gif" width="110" height="221" /></td>
        <td width="111"><img src="HomeImages/Home_03.gif" width="111" height="221" /></td>
        <td width="142"><img src="HomeImages/Home_04.gif" width="142" height="221" /></td>
        <td width="313"><img src="HomeImages/Home_05.gif" width="316" height="221" /></td>
        <td width="262"><img src="HomeImages/Home_06.gif" width="292" height="221" /></td>
      </tr>
      <tr>
        <td><img src="HomeImages/Home_07.gif" width="309" height="95" /></td>
        <td><img src="HomeImages/Home_08.gif" width="110" height="95" /></td>
        <td><img src="HomeImages/Home_09.gif" width="111" height="95" /></td>
        <td><img src="HomeImages/Home_10.gif" width="142" height="94" /></td>
        <td><a href="DemoMenu.html"><img src="HomeImages/Home_11.gif" width="316" height="94" /></a></td>
        <td><img src="HomeImages/Home_12.gif" width="292" height="95" /></td>
      </tr>
      <tr>
        <td><img src="HomeImages/Home_13.gif" width="309" height="121" /></td>
        <td><img src="HomeImages/Home_14.gif" width="110" height="121" /></td>
        <td><img src="HomeImages/Home_15.gif" width="111" height="121" /></td>
        <td><img src="HomeImages/Home_16.gif" width="142" height="121" /></td>
        <td><img src="HomeImages/Home_17.gif" width="316" height="121" /></td>
        <td><img src="HomeImages/Home_18.gif" width="292" height="121" /></td>
      </tr>
      <tr>
        <td><img src="HomeImages/Home_19.gif" width="309" height="91" /></td>
        <td><img src="HomeImages/Home_20.gif" width="110" height="91" /></td>
        <td><img src="HomeImages/Home_21.gif" width="111" height="91" /></td>
        <td><img src="HomeImages/Home_22.gif" width="142" height="91" /></td>
        <td><img src="HomeImages/Home_23.gif" width="316" height="91" /></td>
        <td><img src="HomeImages/Home_24.gif" width="292" height="91" /></td>
      </tr>
      <tr>
        <td><img src="HomeImages/Home_25.gif" width="309" height="142" /></td>
        <td><img src="HomeImages/Home_26.gif" width="110" height="142" /></td>
        <td><img src="HomeImages/Home_27.gif" width="111" height="142" /></td>
        <td><img src="HomeImages/Home_28.gif" width="142" height="142" /></td>
        <td><img src="HomeImages/Home_29.gif" width="316" height="142" /></td>
        <td><img src="HomeImages/Home_30.gif" width="292" height="142" /></td>
      </tr>
      <tr>
        <td><img src="HomeImages/Home_31.gif" width="309" height="94" /></td>
        <td><img src="HomeImages/Home_32.gif" width="110" height="94" /></td>
        <td><img src="HomeImages/Home_33.gif" width="111" height="94" /></td>
        <td><img src="HomeImages/Home_34.gif" width="142" height="94" /></td>
        <td><img src="HomeImages/Home_35.gif" width="316" height="94" /></td>
        <td><img src="HomeImages/Home_36.gif" width="292" height="94" /></td>
      </tr>
      <tr>
        <td><img src="HomeImages/Home_37.gif" width="309" height="124" /></td>
        <td><img src="HomeImages/Home_38.gif" width="110" height="124" /></td>
        <td><img src="HomeImages/Home_39.gif" width="111" height="124" /></td>
        <td><img src="HomeImages/Home_40.gif" width="142" height="124" /></td>
        <td><img src="HomeImages/Home_41.gif" width="316" height="124" /></td>
        <td><img src="HomeImages/Home_42.gif" width="292" height="124" /></td>
      </tr>
      <tr>
        <td><img src="HomeImages/Home_43.gif" width="309" height="109" /></td>
        <td><img src="HomeImages/Home_44.gif" width="110" height="109" /></td>
        <td><img src="HomeImages/Home_45.gif" width="111" height="109" /></td>
        <td><img src="HomeImages/Home_46.gif" width="142" height="109" /></td>
        <td><img src="HomeImages/Home_47.gif" width="316" height="109" /></td>
        <td><img src="HomeImages/Home_48.gif" width="292" height="109" /></td>
      </tr>
      <tr>
        <td><img src="HomeImages/Home_49.gif" width="309" height="600" /></td>
        <td><img src="HomeImages/Home_50.gif" width="110" height="600" /></td>
        <td><img src="HomeImages/Home_51.gif" width="111" height="600" /></td>
        <td><img src="HomeImages/Home_52.gif" width="142" height="600" /></td>
        <td><img src="HomeImages/Home_53.gif" width="316" height="600" /></td>
        <td><img src="HomeImages/Home_54.gif" width="292" height="600" /></td>
      </tr>
    </table>
    </body>
    </html>

  • Slide show in table cell and text in layer above images

    I need to create a slide show within
    a table cell (one cell of several).  The
    display should commence after the launch page has been completely loaded and only appear once.  Also, there needs to be text in a layer above the slide images which changes coordinated with each slide but is generated independent of each slide and therefore may be positioned within the cell independently.
    Anyone?

    Hi again Nancy,
    You've provided very helpful information in the past.  The code for the "show" in the upper right position would be perfect if the text-bar background could be made transparent and positioned higher against the image. Your suggestion has forced me to clarify my concept in my own mind.  The need for transparency hadn't occurred to me yet. 
    An alternative would be the upper left "show" in a bottom layer with text with a transparent background in a top layer.  The text in the top layer would remain constant from the time of the page's loading; i.e., would be independent of changes in the bottom layer.  Perhaps I could figure out the code necessary to coordinate that text's change of shade from one slide to the next appropriate to the slide's shade.
    I'm assuming that a table cell can be partitioned into layers using HTML and each layer programmed independently using JavaScript.
    Thanks again for your prompt attention.

  • Dreamweaver CS4 - Can't see table cells and borders

    Hello you all.  I just started using CS4 and whenever there is a white background I can't see any of the table cell or main borders.
    I went to View>Visual Aids>Table Borders and it is on, but I can't seem to find the area I need to change the color to view it on white.

    I just remember the previous versions would allow you to change the dotted line color that indicated the table and cell borders.
    Must say I can't ever remember that being a preference in any previous version of DW.
    Sadly, it looks like I will be using tables to set up my site.  Haven't adopted CSS as much as I'd like at this point.
    Now's as good a time as any to start with CSS from the ground up.
    Try one of the pre-made templates in DW under File > New

  • Adding new field in customized table ZPM_QMEL_EXT

    Hi all,
    My requirement is  to add a new field in ZPM_QMEL_EXT table numeric field no of  months due (ZZ_CO_MON_DUE) .
    Its value will be calculated as the # of invoices that were paid vs. what has not been paid and then from there, value of this field will be fetched.It has to be populated during the time of notifcation screen entry (iw51). The logic will be similar to this
      SELECT FAEDN FROM DFKKOP INTO TABLE IT_DU_DT
                                  WHERE GPART EQ WA_QMEL-KUNUM AND
                                        VKONT EQ WA_QMEL-ZZ_VKONT.
        SORT IT_DU_DT BY FAEDN ASCENDING.
        READ TABLE IT_DU_DT INTO WA_DU_DT INDEX 1.
        MOVE WA_DU_DT-FAEDN TO DUE_DT.
        CALL FUNCTION 'HR_MONTHS_BETWEEN_TWO_DATES'
          EXPORTING
            I_DATUM_BIS = SY-DATUM
            I_DATUM_VON = DUE_DT
          IMPORTING
            E_MONATE    = NO_MT.
        IF NO_MT IN P_DU_MT.
          WA_QMEL-DUE_MONTHS = NO_MT.
    Awaiting your kind help .
    Thanks
    hariom.

    Hi,
    There is only one option to include extra field for standard tables that is Append Structure other than we don't have any option.
    For Customizing tables we can use Append structure as well as Include Structure.
    Rules: Append Structure should be in last in Field column but include structure you can insert in any where it means between the fields.
    Delivery class option  and data class will take care automatically while upgrading the sap system one version to Another version.(upgrading).
    For that you should maintain the those properties when data base table creation.
    i hope the above information may helpful to you.
    Best Regards
    Sreenivas Pachva

  • Customized table cell renderer doesn't work after table data model changed

    Hi:
    I have a jtable with a custimized table cell render (changes the row color). Everything works fine while the data model is unchanged. I can change the row color, etc. However, after I delete one row or any number of rows in the table, the data model is updated and the custmized table cell renderer is not being called anymore while jtable is rendering on its cells. Seems like the table cell render is no long associated with the jtable. Is this a known problem? Any help would be appreciated.
    Thanks

    I am having the same problem. Has anybody solved this issue?
    Thanks

  • Take out multiple values from a db and handle them in an applet.

    I have a db with tables. I want to take out several values from them and make them visible in a JFrame (or applet).
    I dont know how to do. I have an app that connects to the db and selects the values and puts the Strings in a Vector. But now then?
    I have looked at examples that retrieve Strings but not vectors, isn't that possible?

    Hi,
    On initialization of your frame you can loop over your vector and display them.
    Now the problem is in what type of component do you want to put your data.
    I can give you an example.
    What you can do is create a String which will contain all the data from
    your vector and set that string to the component.
    Example:
    Vector data;
    String result;
    for(int i=0; i < data.size(); i++) {
    result += (String)data.elementAt(i) + "\n";
    Now you need to put the string into a component which is easy done.
    Let take a textarea component.
    JTextArea txaTest = new JTextArea();
    txtTest.setText(result);
    Now all the data will be shown in the textarea component on your frame.

  • Serialize Custome Table Cell Colors and Outlines to XML

    I would like to be able to have custom cell shading and outlining available as attribute or properties of the CELL element so I can have it serialized to XML along with the rest of my document.
    Currently, I have some fancy cell shading in my tables. But I export it to XML, then bring it back into FM8 and the fancy shading is lost.
    Or, more realistically, I want to generate the XML from a data source (like a Versant database) to import into FM8, and I cannot perform the cell shading during XML generation.

    I would like to be able to have custom cell shading and outlining available as attribute or properties of the CELL element so I can have it serialized to XML along with the rest of my document.
    Currently, I have some fancy cell shading in my tables. But I export it to XML, then bring it back into FM8 and the fancy shading is lost.
    Or, more realistically, I want to generate the XML from a data source (like a Versant database) to import into FM8, and I cannot perform the cell shading during XML generation.

  • Custom Table Cell Renderer Unable To Set Horizontal Alignment

    Hello,
    I have a problem that I'm at my wit's end with, and I was hoping for some help.
    I need to render the cells in my table differently (alignment, colors, etc) depending on the row AND the column, not just the column. I've got this working just fine, except for changing the cell's horizontal alignment won't work.
    I have a CustomCellRenderer that extends DefaultTableCellRenderer and overrides the getTableCellRendererComponent() method, setting the foreground/background colors and horizontal alignment of the cell based on the cell's value.
    I have a CustomTable that extends JTable and overrides the getCellRenderer(int row, int column) method to return a private instance of this CustomCellRenderer.
    This works fine for foreground/background colors, but my calls to setHorizontalAlignment() in the getTableCellRendererComponent() seem to have no effect, every cell is always displayed LEFT aligned! It's almost like the cell's alignment is determined by something else than the table.getCellRenderer(row,column).getTableCellRendererComponent() method.
    I've also tried setting the renderer for every existing TableColumn in the TableModel to this custom renderer, as well as overriding the table's getDefaultColumn() method to return this custom renderer as well for any Class parameter, with no success.
    No matter what I've tried, I can customize the cell however I want, EXCEPT for the horizontal alignment!!!
    Any ideas???
    Here's the core custom classes that I'm using:
    class CustomTable extends JTable {
    private CustomRenderer customRenderer = new CustomRenderer();
    public CustomTable() {
    super();
    public TableCellRenderer getCellRenderer(int row, int column) {
    return customRenderer;
    } // end class CustomTable
    class CustomRenderer extends DefaultTableCellRenderer {
    public CustomRenderer() {
    super();
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    if (row % 2 == 0) {
    setForeground(Color.red);
    setHorizontalAlignment(RIGHT);
    } else {
    setForeground(Color.blue);
    setHorizontalAlignment(LEFT);
    return this;
    } // end class CustomRenderer
    Even worse, I've gotten this to work fine in a trivial example I made to try and re-create the problem. But for some reason, this same thing is just not working for horizontal alignment in my actual project?!?
    Anyone have any ideas how the cell's horizontal alignment set in the getTableCellRendererComponent() method is being ignored or overwritten before the cell is being displayed???
    Thanks, any help is appreciated,
    -Alex Blume

    Ok, so I've looked into their source and I think I know where and what the trouble is. The JTable.java has a method called:
    3658> public TableCellRenderer getCellRenderer(int row, int column) {
    3659> TableColumn tableColumn = getColumnModel().getColumn(column);
    3660> TableCellRenderer renderer = tableColumn.getCellRenderer();
    3661> if (renderer == null) {
    3662> renderer = getDefaultRenderer(getColumnClass(column));
    3663> }
    3664> return renderer;
    3665> }
    starting at line 3658 of their source code. It retrieves the TableCellRenderer on line 3660 by calling the tableColumn's getCellRenderer method. This is found in the TableColumn.java class:
    421> public TableCellRenderer getCellRenderer() {
    422> return cellRenderer;
    423> }
    See the problem? Only ONE cell Renderer. It's referring to a variable found at line 140 which is of type TableCellRenderer ... well actually it's created as a DefaultTableCellRenderer at some point since TableCellRenderer is an interface.
    Basically the fix is this:
    In the TableColumn.java file, a collection (Vector, LinkedList, whatever) needs to keep track of each cell's renderer. This will solve the solution. Of course this will be something that you or I can make.
    What's funny is the contradiction in documentation between JTable's and TableColumn's getCellRenderer() method. First, if we look at TableColumn's documentation it states:
    "Returns the TableCellRenderer used by the JTable to draw values for this column."
    Based on that first statement, the getCellRenderer() method in TableColumn is doing its job exactly. No lies, no contradictions in what it does.
    However, that method is called up inside of the JTable's getCellRenderer() method which says a completely different thing which is:
    "Returns an appropriate renderer for the cell specified by this row and column."
    Now we have a problem. For the cell specified. It appears that the rush to push this out blinded some developer who either:
    1) mis-interpreted what the JTable getCellRenderer() method was supposed to do and inadvertently added a feature or;
    2) was in a 2 a.m. blitz, wired on Pepsi and adrenalin and wrote the bug in.
    Either way, I'm really hoping that they'll fix this because it will take care of at least 2 bugs. Btw, anyone interested in posting a subclass to solve this problem (subclass of TableColumn) is more than welcome. I've spent much too much time on this and my project is already behind so I can't really afford any more time on this.
    later,
    a.

  • Help with creating a custom table cell editor?

    hi, i was reading up on various tutorials and trying to write codes that pops up a simple calendar when clicked on text of the Date class in a table, so far, i can't seem to get my classes working.. the following is some classes i've written for this task (note, there are alot of commented out lines, those are the modifications done to the tutorial classes in http://java.sun.com/docs/books/tutorial/)
    any help would be appreciated :D
    thanks in advance!
    What i have done so far:
    /** BASIC TABLE CLASS FOR DEMONSTRATION*/
    //import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    public class TableBasic extends JFrame
         public TableBasic()
              String[] columnNames = { "Date", "String", "Integer", "Boolean" };
              Object[][] data =
                   {  { new Date(), "A", new Integer(1), Boolean.TRUE },
                        {new Date(), "B", new Integer(2), Boolean.FALSE },
                        {new Date(), "C", new Integer(9), Boolean.TRUE },
                        {new Date(), "D", new Integer(4), Boolean.FALSE}
              JTable table = new JTable(data, columnNames)
                   //Returning the Class of each column will allow different
                   //renderers to be used based on Class
                   public Class getColumnClass(int column)
                        return getValueAt(0, column).getClass();
              table.setDefaultRenderer(Date.class, new CalendarRenderer(true));
              table.setDefaultEditor(Date.class, new CalendarEditor());
              table.setPreferredScrollableViewportSize(table.getPreferredSize());
              JScrollPane scrollPane = new JScrollPane(table);
              getContentPane().add(scrollPane);
         public static void main(String[] args)
              TableBasic frame = new TableBasic();
              frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
              frame.pack();
              //frame.setLocationRelativeTo(null);
              frame.setVisible(true);
    * CLASS BASED ON ColorRenderer.java at http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/ColorRenderer.java
    import javax.swing.BorderFactory;
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.border.Border;
    import javax.swing.table.TableCellRenderer;
    //import java.awt.Color;
    import java.awt.Component;
    public class CalendarRenderer
         extends JLabel
         implements TableCellRenderer
         Border unselectedBorder = null;
         Border selectedBorder = null;
         boolean isBordered = true;
         public CalendarRenderer(boolean isBordered)
              this.isBordered = isBordered; setOpaque(true);
              //MUST do this for background to show up.
         public Component getTableCellRendererComponent(JTable table,
                                                                     Object color,
                                                                     boolean isSelected,
                                                                     boolean hasFocus,
                                                                     int row,
                                                                     int column)
              String newDate = (String)color;
              setText(newDate);
              if (isBordered)
                   if (isSelected)
                        if (selectedBorder == null)
                             selectedBorder = BorderFactory.createMatteBorder(2,5,2,5, table.getSelectionBackground());
                        setBorder(selectedBorder);
                   else
                        if (unselectedBorder == null)
                             unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5, table.getBackground());
                        setBorder(unselectedBorder);
              //setToolTipText("RGB value: " + newColor.getRed() + ", " + newColor.getGreen() + ", " + newColor.getBlue());
              return this;
    * the editor based on ColorEditor.java at http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/ColorEditor.java
    import javax.swing.AbstractCellEditor;
    import javax.swing.table.TableCellEditor;
    import javax.swing.JButton;
    import javax.swing.JColorChooser;
    import javax.swing.JDialog;
    import javax.swing.JTable;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    public class ColorEditor
         extends AbstractCellEditor
         implements TableCellEditor, ActionListener
         Color currentColor;
         JButton button;
         JColorChooser colorChooser;
         JDialog dialog;
         protected static final String EDIT = "edit";
         public ColorEditor()
              //Set up the editor (from the table's point of view),
              //which is a button.
              //This button brings up the color chooser dialog,
              //which is the editor from the user's point of view.
              button = new JButton();
              button.setActionCommand(EDIT);
              button.addActionListener(this);
              button.setBorderPainted(false);
              //Set up the dialog that the button brings up.
              colorChooser = new JColorChooser();
              dialog = JColorChooser.createDialog(button,
                   "Pick a Color",
                   true, //modal
                   colorChooser,
                   this, //OK button handler
                   null); //no CANCEL button handler
          * Handles events from the editor button and from
          * the dialog's OK button.
         public void actionPerformed(ActionEvent e)
              if (EDIT.equals(e.getActionCommand()))
                   //The user has clicked the cell, so
                   //bring up the dialog.
                   button.setBackground(currentColor);
                   colorChooser.setColor(currentColor);
                   dialog.setVisible(true); //Make the renderer reappear.
                   fireEditingStopped();
              else
                   //User pressed dialog's "OK" button.
                   currentColor = colorChooser.getColor();
         //Implement the one CellEditor method that AbstractCellEditor doesn't.
         public Object getCellEditorValue()
              return currentColor;
         //Implement the one method defined by TableCellEditor.
         public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
              currentColor = (Color)value; return button;
    /** THE SIMPLE CALENDAR WRITTEN TALIORED TO WORK WITH DIALOGS*/
    import javax.swing.*;
    import java.util.Calendar;
    import java.awt.*;
    import java.awt.event.*;
    import java.text.SimpleDateFormat;
    //import java.beans.*; //property change stuff
    public class CalendarDialog
         extends JDialog
         //implements PropertyChangeListener
         private JButton[] btn = new JButton[49];
         private int month = Calendar.getInstance().get(Calendar.MONTH);
         private int year = Calendar.getInstance().get(Calendar.YEAR);
         private JLabel lbl = new JLabel("", JLabel.CENTER);
         private JOptionPane optionPane;
         private String curDate = null;
         private JTextArea output = new JTextArea(curDate, 1, 20);
         private String btnString1 = "Enter";
         private String btnString2 = "Cancel";
         public CalendarDialog()
              //super(aFrame, true);
              setContentPane(buildGUI());
              setDates();
         public JPanel buildGUI()
              JPanel panel = new JPanel();
              String[] header = { "Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat" };
              JPanel midPanel = new JPanel(new GridLayout(7, 7));
              for (int x = 0; x < btn.length; x++)
                   final int selection = x;
                   btn[x] = new JButton();
                   btn[x].setFocusPainted(false);
                   if (x < 7)
                        JLabel lbl = new JLabel(header[x], JLabel.CENTER);
                        lbl.setFont(new Font("Lucida", Font.PLAIN, 10));
                        midPanel.add(lbl);
                   else
                        btn[x].addActionListener(new ActionListener()
                             public void actionPerformed(ActionEvent ae)
                                  displayDatePicked(btn[selection].getActionCommand());
                        midPanel.add(btn[x]);
              JPanel lowPanel = new JPanel(new GridLayout(1, 3));
              JButton prevBtn = new JButton("<< Previous");
              prevBtn.addActionListener(new ActionListener()
                   public void actionPerformed(ActionEvent ae)
                        month--;
                        setDates();
              lowPanel.add(prevBtn);
              lowPanel.add(lbl);
              lowPanel.add(output);
              JButton nextBtn = new JButton("Next >>");
              nextBtn.addActionListener(new ActionListener()
                   public void actionPerformed(ActionEvent ae)
                        month++;
                        setDates();
              lowPanel.add(nextBtn);
              JPanel outputPanel = new JPanel();
              Object[] options = { btnString1, btnString2 };
              optionPane =
                   new JOptionPane(
                        output,
                        JOptionPane.QUESTION_MESSAGE,
                        JOptionPane.YES_NO_OPTION,
                        null,
                        options,
                        options[0]);
              outputPanel.add(optionPane);
              panel.setLayout(new BorderLayout());
              panel.add(lowPanel, BorderLayout.NORTH);
              panel.add(midPanel, BorderLayout.CENTER);
              panel.add(outputPanel, BorderLayout.SOUTH);
              return panel;
         public void setDates()
              for (int x = 7; x < btn.length; x++)
                   btn[x].setText("");
              SimpleDateFormat sdf = new SimpleDateFormat("MMMM yyyy");
              Calendar cal = Calendar.getInstance();
              cal.set(year, month, 1);
              int dayOfWeek = cal.get(java.util.Calendar.DAY_OF_WEEK);
              int daysInMonth = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH);
              for (int x = 6 + dayOfWeek, day = 1; day <= daysInMonth; x++, day++)
                   btn[x].setText("" + day);
              lbl.setText(sdf.format(cal.getTime()));
         public void displayDatePicked(String day)
              if (day.equals("") == false)
                   SimpleDateFormat sdf = new SimpleDateFormat("EEEE d MMMM, yyyy");
                   Calendar cal = Calendar.getInstance();
                   cal.set(year, month, Integer.parseInt(day));
                   curDate = sdf.format(cal.getTime());
                   //JOptionPane.showMessageDialog(this, "You picked " + sdf.format(cal.getTime()));
                   output.setText(sdf.format(cal.getTime()));
         public String getDate()
              return curDate;
         public void setDate(String date)
              curDate = date;
    }

    well, i have indeed narrowed down my problem after some digging around.. one thing i discovered that i don't need CalendarRenderer.java.. and i found out i don't really know what does
    //Implement the one method defined by TableCellEditor.
         public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
              curDate = (String)value; return button;
         }do, as it seems to be the problem:
    java.lang.ClassCastException
         at CalendarEditor.getTableCellEditorComponent(CalendarEditor.java:78)
         at javax.swing.JTable.prepareEditor(JTable.java:3786)
         at javax.swing.JTable.editCellAt(JTable.java:2531)
         at javax.swing.plaf.basic.BasicTableUI$MouseInputHandler.adjustFocusAndSelection(BasicTableUI.java:510)
         at javax.swing.plaf.basic.BasicTableUI$MouseInputHandler.mousePressed(BasicTableUI.java:494)
         at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:222)
         at java.awt.Component.processMouseEvent(Component.java:5097)
         at java.awt.Component.processEvent(Component.java:4897)
         at java.awt.Container.processEvent(Container.java:1569)
         at java.awt.Component.dispatchEventImpl(Component.java:3615)
         at java.awt.Container.dispatchEventImpl(Container.java:1627)
         at java.awt.Component.dispatchEvent(Component.java:3477)
         at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
         at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3195)
         at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
         at java.awt.Container.dispatchEventImpl(Container.java:1613)
         at java.awt.Window.dispatchEventImpl(Window.java:1606)
         at java.awt.Component.dispatchEvent(Component.java:3477)
         at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
         at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
         at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
         at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
         at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
         at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
    mmm.. does anyone know what i should modify for that to work?

  • Need Help with giving Colors to Table Cells and Table Borders in Dreamweaver CC - Please!

    Hi,
    I am a teacher and use Dreamweaver CC to make my class web page.
    How do I give colors to the cell borders of a table I inserted?  How do I give colors and line thickness
    to table borders, too?
    I bought the David Powers DVD and it doesn't show that.
    Please help.
    Thank you,
    John

    Assuming that you have placed a table in your document and your CSS Designer panel is open
    1. Click the '+' sign
    2. Choose your option. I will choose 'Define in Page'
    3. Follow the above sequence, 1.click on table, 2.ensure table is selected, 3.click on style, 4.click the '+' sign, 5. see the selector appear.
    4. Click on the selector and choose the required Properties.
    You can do the same for the row (<tr>) or a cell (<td>). In fact, this is how you would go about styling anything in your document.

Maybe you are looking for