How do you add a border to a row in a Jtable?

后端 未结 3 466
梦如初夏
梦如初夏 2021-01-03 13:16

I have a Jtable and I want to highlight a row by adding a border to the row. I have extended a DefaultTableCellRenderer and I figure the work needs to be done i

3条回答
  •  难免孤独
    2021-01-03 14:03

    I would not create a custom renderer for this. Yes it will work if all your data is of the same type. But what happens when you start to mix Strings, with Dates and Integers and Booleans which all use different renderers? Then you would need to create 4 custom renderers.

    The better approach is to override the prepareRenderer(...) method JTable so you can add the code in one place. Here is an example to get you started. In reality you would want to use a CompoundBorder that contains a MatteBorder for the top/bottom and and EmptyBorder for the left/right and you would create a single instance of the Border.

    import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import javax.swing.text.*;
    import javax.swing.border.*;
    
    public class TablePrepareRenderer extends JFrame
    {
        JTable table;
    
        public TablePrepareRenderer()
        {
            Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
            Object[][] data =
            {
                {"Buy", "IBM", new Double(1000), new Double(80.5), Boolean.TRUE},
                {"Sell", "MicroSoft", new Double(2000), new Double(6.25), Boolean.TRUE},
                {"RSell", "Apple", new Double(3000), new Double(7.35), Boolean.TRUE},
                {"Buy", "Nortel", new Double(4000), new Double(20), Boolean.TRUE}
            };
    
            DefaultTableModel model = new DefaultTableModel(data, columnNames);
            table = new JTable( model )
            {
                //  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();
                }
    
                public Component prepareRenderer(
                    TableCellRenderer renderer, int row, int column)
                {
                    Component c = super.prepareRenderer(renderer, row, column);
                    JComponent jc = (JComponent)c;
    
                    //  Color row based on a cell value
                    //  Alternate row color
    
                    if (!isRowSelected(row))
                        c.setBackground(row % 2 == 0 ? getBackground() : Color.LIGHT_GRAY);
                    else
                        jc.setBorder(new MatteBorder(1, 0, 1, 0, Color.RED) );
    
    
                    //  Use bold font on selected row
    
                    return c;
                }
            };
    
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            table.changeSelection(0, 0, false, false);
            JScrollPane scrollPane = new JScrollPane( table );
            getContentPane().add( scrollPane );
        }
    
        public static void main(String[] args)
        {
            TablePrepareRenderer frame = new TablePrepareRenderer();
            frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible(true);
        }
    }
    

提交回复
热议问题