JTable中标头和数据之间的分隔符

时间:2014-08-18 13:52:06

标签: java swing jtable

我想构建一个简单的JTable,它除了表头和表数据之间的单个水平分隔符之外没有网格线。分隔符应该像JSeparator一样跨越表的整个宽度。我已经设法使用JLabel和放置在GridBagLayout中的JSeparator来实现所需的外观,但是结果有点笨拙并且我无法帮助但感觉存在更简洁的解决方案(可能使用MatteBorder?)。任何帮助将不胜感激!

编辑:可以使用单行代码实现解决方案:

table.getTableHeader().setBorder(new MatteBorder(0,0,1,0, Color.BLACK));

1 个答案:

答案 0 :(得分:1)

您可能做过类似的事情:

  1. 创建一个TableCellRenderer。

    TableCellRenderer renderer = new DefaultTableCellRenderer() {
    
        final JLabel headerLabel = new JLabel();
        {
            //setBorder(BorderFactory.createEmptyBorder());
            headerLabel.setBorder(BorderFactory.createMatteBorder(0, 0, 3, 0, Color.RED));
            headerLabel.setOpaque(true);
            headerLabel.setBackground(Color.WHITE);
        }
    
        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value,
                boolean isSelected,
                boolean hasFocus,
                int row,
                int column) {
            if (row == -1) {
                label.setText(value.toString());
                return headerLabel;
            }
            return super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
                      row, column);
        }
    
    };
    
  2. 将它用于表头(row == -1)。人们也可以将它用于细胞。

    for (int i = 0; i < model.getColumnCount(); ++i) { 
        table.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(renderer);
    }
    
  3. 使用

    table.showHorizontalLines(false);
    table.showVerticalLines(false);
    
  4. table.setGridColor(Color.WHITE);
    
  5. 我只为标题使用单元格渲染器,以下内容可能就足够了:

        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        renderer.setBorder(BorderFactory.createMatteBorder(0, 0, 3, 0, Color.RED));
        renderer.setOpaque(true);
        renderer.setBackground(Color.WHITE);