代码之家  ›  专栏  ›  技术社区  ›  Ryan Elkins

如何向jtable中的行添加边框?

  •  1
  • Ryan Elkins  · 技术社区  · 15 年前

    我有一个jtable,我想通过向行添加边框来突出显示一行。我已经延长了 DefaultTableCellRenderer 我认为这项工作需要在 getTableCellRendererComponent 方法。

    我猜,因为似乎没有行的概念,所以我需要为行中的单个单元格创建自定义边框。类似于第一个单元格的左侧、顶部和底部,所有内部单元格的顶部和底部,以及行中最后一个单元格的顶部、底部和右侧。我很难找到如何真正执行思考过程。我不知道如何使用 setBorder() 方法,或者如果这是我需要的方向。

    3 回复  |  直到 13 年前
        1
  •  2
  •   broschb    15 年前

    您有正确的想法,需要根据表格中的位置(即边缘、中心等)在CellRenderer中的标签上设置边框。

    看一看 matteborder . 可以指定要沿w/宽度和颜色绘制边框的区域。

        2
  •  8
  •   camickr    15 年前

    我不会为此创建自定义渲染器。是的,如果您的所有数据都是同一类型,它将工作。但是当你开始混合字符串时,会发生什么,日期、整数和布尔值都使用不同的渲染器?然后您需要创建4个自定义渲染器。

    更好的方法是重写PrepareDerer(…)方法jtable,这样您就可以在一个地方添加代码。下面是一个开始的例子。实际上,您需要使用一个复合边界,其中顶部/底部包含一个MatteBorder,左侧/右侧包含EmptyOrder,并创建一个边界实例。

    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);
        }
    }
    
        3
  •  0
  •   kleopatra Aji kattacherry    13 年前

    我同意卡米克 最好的方法是重写Preparerendere方法。以下代码将为具有选定单元格的行创建边框:

    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
    
    Component c = super.prepareRenderer(renderer, row, column);    
    JComponent jc = (JComponent)c;
    
    if (isRowSelected(row)){
      int top = (row > 0 && isRowSelected(row-1))?1:2;
      int left = column == 0?2:0;
      int bottom = (row < getRowCount()-1 && isRowSelected(row + 1))?1:2;
      int right = column == getColumnCount()-1?2:0;
    
      jc.setBorder(BorderFactory.createMatteBorder(top, left, bottom, right, this.getSelectionBackground())); 
    }
    else
      jc.setBorder(null);
    
    return c;
    }