Question

How to apply cell renderer and table model to the same JTable? The problem is that if I apply cell renderer, then JTable does not display checkboxes for Boolean type fields. However, if I do not apply cell renderer, then time fields (JodaTime) are not formatted properly.

        model = new DefaultTableModel(data, columnNames) 
        {

            private static final long serialVersionUID = 1L;

            @Override
            public int getColumnCount() {
                return columnNames.length;
            }

            @Override
            public int getRowCount() {
                return data.length;
            }

            @Override
            public String getColumnName(int col) {
                return (String) columnNames[col];
            } 

            @Override
            public Object getValueAt(int row, int column) {
                return data[row][column];
            }

            @Override
            public Class getColumnClass(int column) {
                return (getValueAt(0, column).getClass());
            }

            @Override
            public void setValueAt(Object value, int row, int column) {
                data[row][column] = value;
            }

            @Override
            public boolean isCellEditable(int row, int column) {
                return (column != 0);
            }

        };

        DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer() 
        {
            public Component getTableCellRendererComponent( JTable table, Object value, boolean
                                                            isSelected, boolean hasFocus, int row, int column)
            {
                super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
                if ( value instanceof LocalTime )
                {
                    DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm");
                    String strTime = formatter.print((LocalTime)value);
                    this.setText(strTime);
                }

                return this;
            }

        };

table = new JTable(model);
        for (int i = 0; i < table.getColumnCount(); ++i) 
        {
            table.getColumnModel().getColumn(i).setCellRenderer(cellRenderer);
        }
Was it helpful?

Solution

There is no need for you do create a completely new DefaultTableModel. The only method you need to override is the getColumnClass() method to return the class of data that is stored for the given column.

In fact I don't know how your model works. The DefaultTableModel uses a Vector of Vectors to store the data, you should not be attempting to reference an external 2D array called "data".

The next question is why are you attempting to assign you custom renderer to all columns? If you want to use your renderer for Date Objects then you should do something like:

table.setDefaultRenderer(Date.class, cellRenderer);

Then Dates will use that renderer and all other columns will use the provided renderers.

OTHER TIPS

Possibly a typographic error in your code?

    DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer() 
    {
        public Component getTableCellRendererComponent( JTable table, Object value, boolean
                                                        isSelected, boolean hasFocus, int row, int column)
        {
            Component toReturn= super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
            if ( value instanceof LocalTime )
            {
                DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm");
                String strTime = formatter.print((LocalTime)value);
                this.setText(strTime);
                toReturn= this;
            }
            else if( value instanceof Boolean ) {
                JCheckbox checkbox= new JCheckbox();
                checkbox.setSelected((Boolean)value));
                toReturn= checkbox;
            }
            return toReturn;
        }
    };
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top