Search code examples
javaswingjtable

GUI JTable change borders to text


I am in the process of creating a GUI that displays temnporary files from the server (via JTable). However, I don't like the mock, or the first test. For me the text and the numbers are too far to the left edges. Does anyone have an exact idea how to set up the text and numbers a little (not justified)?

table = new JTable(data, header);
table.setFont(newFont("Times New Roman", Font.PLAIN, 16));
JScrollPane scrollpane = new JScrollPane(table);

GridbagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 2;
c.gridheight= 1;
c.weightx = 0;
c.gweighty = 0;
c.fill = GridBagConstraints. HORIZONTAL;
c.insets = new Insets(5, 5, 5, 5);
pnlFull.add(scrollPane, c);

GUI Overlay with JTable


Solution

  • Typically, numbers would be stored in the model an Integer objects and the renderer would display the number right aligned.

    With that in mind here is an approach that will indent both left/right aligned data by 5 pixels by adjusting the Border used by the renderer:

    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import javax.swing.border.*;
    
    public class TableIndent extends JPanel
    {
        public TableIndent()
        {
            String[] columnNames = {"Date", "String", "Integer", "Boolean"};
            Object[][] data =
            {
                {new Date(), "A", Integer.valueOf(1), Boolean.TRUE },
                {new Date(), "B", Integer.valueOf(2), Boolean.FALSE},
                {new Date(), "C", Integer.valueOf(19), Boolean.TRUE },
                {new Date(), "D", Integer.valueOf(4), Boolean.FALSE}
            };
    
            DefaultTableModel model = new DefaultTableModel(data, columnNames)
            {
                //  Returning the Class of each column will allow different
                //  renderers and editors to be used based on Class
    
                public Class getColumnClass(int column)
                {
                    switch (column)
                    {
                        case 0: return Date.class;
                        case 2: return Integer.class;
                        case 3: return Boolean.class;
                    }
    
                    return super.getColumnClass(column);
                }
            };
    
    
            JTable table = new JTable(model)
            {
                private Border insideLeft = new EmptyBorder(0, 5, 0, 0);
                private Border insideRight = new EmptyBorder(0, 0, 0, 5);
    
                public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
                {
                    Component c = super.prepareRenderer(renderer, row, column);
    
                    if (renderer instanceof DefaultTableCellRenderer)
                    {
                        DefaultTableCellRenderer cellRenderer = (DefaultTableCellRenderer)renderer;
    
    //                  if ( cellRenderer.getHorizontalAlignment() ==  SwingConstants.LEFT )
                        if ( cellRenderer.getHorizontalAlignment() ==  SwingConstants.LEADING )
                        {
                            JComponent jc = (JComponent)c;
                            Border border = new CompoundBorder(jc.getBorder(), insideLeft);
                            jc.setBorder( border );
                        }
    
                        if ( cellRenderer.getHorizontalAlignment() ==  SwingConstants.RIGHT )
                        {
                            JComponent jc = (JComponent)c;
                            Border border = new CompoundBorder(jc.getBorder(), insideRight);
                            jc.setBorder( border );
                        }
                    }
    
                    return c;
                }
            };
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
    
            JScrollPane scrollPane = new JScrollPane( table );
            add( scrollPane );
        }
    
        private static void createAndShowGUI()
        {
            JFrame frame = new JFrame("Table Indent");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new TableIndent());
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationByPlatform( true );
            frame.setVisible( true );
        }
    
        public static void main(String[] args) throws Exception
        {
            SwingUtilities.invokeLater( () -> createAndShowGUI() );
        }
    }