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

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

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

您有正确的想法,您需要在cellrenderer中的标签上设置边框,具体取决于它在表格中的位置(即边缘,中心等)。

看看matteborder 。 您可以指定沿宽度和颜色绘制边框的区域。

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

我同意> camickr最好的方法是覆盖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; }