如何在Jtable中的行中添加边框?

Rya*_*ins 2 java user-interface swing jtable

我有一个Jtable,我想通过在行中添加边框来突出显示一行.我扩展了一个DefaultTableCellRenderer,我认为需要在getTableCellRendererComponent方法中完成工作.

我猜测,因为似乎没有一行的概念,我需要为行中的单个单元格创建自定义边框.类似于第一个单元格的左侧,顶部和底部,所有内部单元格的顶部和底部,以及行中最后一个单元格的顶部,底部和右侧.我在查找如何实际执行思考过程时遇到了问题.我不确定如何使用该setBorder()方法,或者甚至是我需要采取的方向.

cam*_*ckr 9

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

更好的方法是覆盖prepareRenderer(...)方法JTable,以便您可以在一个地方添加代码.这是一个让你入门的例子.实际上,您可能希望使用包含顶部/底部的MatteBorder和左/右的EmptyBorder的CompoundBorder,您将创建一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)