0

My next annoying problem is to set Space between cells so that content of cells doesn't get erased. I tried already all Internet solutions but they don't help because as I encrease border then content of cell is erased. Here is what I tried:

public class DateFormatDemo extends JFrame
{
    private Border emptyBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
    private JTable dataSearchResultTable;

    public DateFormatDemo()
    {
        JPanel panel = new JPanel(new GridLayout(2, 1, 5, 10));
        panel.setPreferredSize(new Dimension(500, 300));
        panel.add(new JScrollPane(initDataSearchResultTable()));
        super.getContentPane().add(panel);
        super.pack();
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.setVisible(true);
    }

    private JTable initDataSearchResultTable()
    {
        dataSearchResultTable = new JTable(new MyTableModel()) {

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
            {
                JComponent component = (JComponent) super.prepareRenderer(renderer, row, column);
//              component.setBorder(emptyBorder);
                return component;
            }
        };
        dataSearchResultTable.setIntercellSpacing(new Dimension(5, 10));
        dataSearchResultTable.setSelectionBackground(new Color(0xaaaaff));
        dataSearchResultTable.setFillsViewportHeight(true);
        dataSearchResultTable.setRowSelectionAllowed(true);
        dataSearchResultTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        dataSearchResultTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        dataSearchResultTable.setDefaultRenderer(String.class, new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                    boolean hasFocus, int row, int column)
            {
                JComponent component = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                component.setBorder(emptyBorder);
                return component;
            }
        });
        return dataSearchResultTable;
    }

    class MyTableModel extends AbstractTableModel
    {
        private String[] columnNames = { "First Name", "Last Name", "Timestamp", "Number", "Vegetarian" };
        private Object[][] data ;

        MyTableModel()
        {
            data = new Object[][] {
                    { "Vova", "KipokKipokKipokKipok", Timestamp.valueOf("2013-04-12 11:20:41"), new Integer(5),
                            new Boolean(true) },
                    { "Olia", "Duo", Timestamp.valueOf("2010-01-11 11:11:41"), new Integer(3), new Boolean(false) },
                    { "Oksana", "Stack", Timestamp.valueOf("2012-04-12 11:20:41"), new Integer(2), new Boolean(false) },
                    { "Petro", "White", Timestamp.valueOf("2010-04-12 11:20:21"), new Integer(20), new Boolean(true) },
                    { "Ivan", "Brown", Timestamp.valueOf("2011-04-11 11:20:41"), new Integer(10), new Boolean(true) } };
            fireTableDataChanged();
        }

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

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

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

        public Object getValueAt(int row, int col)
        {
            if (data.length > 0 && data[0] != null) {
                return data[row][col];
            }
            return null;
        }

        /*
         * JTable uses this method to determine the default renderer/ editor for
         * each cell. If we didn't implement this method, then the last column
         * would contain text ("true"/"false"), rather than a check box.
         */
        public Class getColumnClass(int c)
        {
            Object valueAt = getValueAt(0, c);
            return valueAt == null ? Object.class : valueAt.getClass();
        }

        /*
         * Don't need to implement this method unless your table's editable.
         */
        public boolean isCellEditable(int row, int col)
        {
                return true;
        }

        /*
         * Don't need to implement this method unless your table's data can
         * change.
         */
        public void setValueAt(Object value, int row, int col)
        {
            if (data.length > 0 && data[0] != null) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
        }

    }

    public static void main(String[] args) throws ParseException
    {
        new DateFormatDemo();
    }
}

Does anybody know how to set space between cells so that cell's content is not erased?

SOLVED:

dataSearchResultTable.setRowHeight(25);
        dataSearchResultTable.setRowMargin(5);
        dataSearchResultTable.getColumnModel().setColumnMargin(20);

But rowMargin causes selected row to be narrower than row borders. The solution is to set rowHeight only without rowMargin. This ensures that selection is not narrower than row itself.

Thanks!

Volodymyr Levytskyi
  • 3,364
  • 9
  • 46
  • 83

1 Answers1

1

Instead of using setRowHeight() method as you mentioned, I recommend you to use next method for your table(found here):

private void updateRowHeights(JTable table ) {
    for (int row = 0; row < table.getRowCount(); row++) {
        int rowHeight = table.getRowHeight();
        for (int column = 0; column < table.getColumnCount(); column++) {
            Component comp = table.prepareRenderer(table.getCellRenderer(row, column), row, column);
            rowHeight = Math.max(rowHeight,comp.getPreferredSize().height);
        }
        table.setRowHeight(row, rowHeight);
    }
}

Because it calculates height for each row. In this case all your rows will be look fine.

When you use setRowHeight() isn't always solve problems of system default properties, try to add that line to your code for example and you will see what I mean dataSearchResultTable.setFont(new Font("Arial", 1, 25));

Community
  • 1
  • 1
alex2410
  • 10,904
  • 3
  • 25
  • 41
  • This method is good when cell-component is bigger than rowHeight but it is not my case – Volodymyr Levytskyi Nov 06 '13 at 18:39
  • Java tutorial gives similar solution but for setting widths [here](http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TableRenderDemoProject/src/components/TableRenderDemo.java) – Volodymyr Levytskyi Nov 06 '13 at 18:41