如何删除Jtable标题网格线

时间:2014-08-07 13:41:29

标签: java swing

如何删除Jtable标题网格线,我能够从行中删除网格线,但它在jtable标题中给出网格线。是否可以删除Jtable标题网格线。

3 个答案:

答案 0 :(得分:3)

  

是否可以删除JTable标题网格线。

好奇:你为什么要那样做?

现在回答:不,不是。表头呈现取决于TableHeaderUILook and Feel呈现器提供的JTableHeader实现。您可以告诉渲染器您不想要边框,但如果L& F使用带边框的自定义画家(f.i。:Nimbus),那么您仍然有边框。

虽然有其他答案中描述的(差)解决方法,但所有这些都有其局限性。

提供自定义渲染器

为了使表头的呈现尽可能与原始表格最相似,这意味着没有丢失列DnD效果,应用排序时的图标等等,我将使用我自己的渲染器,如下所示:

public class TableHeaderRenderer implements TableCellRenderer {

    private final TableCellRenderer baseRenderer;

    public TableHeaderRenderer(TableCellRenderer baseRenderer) {
        this.baseRenderer = baseRenderer;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JComponent c = (JComponent)baseRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBorder(new EmptyBorder(2,2,2,2));
        return c;
    }
}

然后您可以使用默认渲染器作为新渲染器的基础,如下所示:

JTable table = new JTable(5, 5);
table.setAutoCreateRowSorter(true);
table.setShowGrid(false);

TableCellRenderer baseRenderer = table.getTableHeader().getDefaultRenderer();
table.getTableHeader().setDefaultRenderer(new TableHeaderRenderer(baseRenderer));

然而,它的功能取决于L& F:例如,这不适用于Nimbus。

使用UIManager属性

正如@blackbishop所述,你可以使用UIManager设置一个属性来告诉L& F它不能绘制表头单元格边框。然而,没有关于这些属性的约定(每个L& F都有自己的属性),大多数L& F可能会忽略它们。

答案 1 :(得分:2)

请参阅JTableHeader without the grid lines

table.setShowGrid(false);
table.setIntercellSpacing(new Dimension(0,0));

您可能还需要查看之前(更长)的答案。

以下代码(来自上面的链接)显示jTable没有网格线(表标题)

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableHeaderTest
{
    public static void main(String[] args)
    {
        String[] headers = {
            "column 1", "column 2", "column 3", "column 4"
        };
        String[][] data = new String[4][4];
        for(int i = 0; i < data.length; i++)
            for(int j = 0; j < data[0].length; j++)
            {
                data[i][j] = "item " + (i * data[0].length + j + 1);
            }
        JTable table = new JTable(data, headers);
        for(int i = 0; i < headers.length; i++)
        {
            TableColumn column = table.getColumnModel().getColumn(i);
            column.setHeaderRenderer(new HeaderRenderer());
        }
        table.setShowGrid(false);
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new JScrollPane(table));
        f.setSize(400,300);
        f.setLocation(200,200);
        f.setVisible(true);
    }
}

class HeaderRenderer extends JLabel implements TableCellRenderer
{
    public Component getTableCellRendererComponent(JTable table,
                                                   Object value,
                                                   boolean hasFocus,
                                                   boolean isSelected,
                                                   int row,
                                                   int col)
    {
        setText(value.toString());
        setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
        return this;
    }
}

答案 2 :(得分:2)

可以使用UIManager

来做到这一点
UIManager.getDefaults().put("TableHeader.cellBorder" , BorderFactory.createEmptyBorder(0,0,0,0));

注意:这不会更改一个JTable的TableHeader单元格边框,但会更改应用程序中的所有JTable。这是因为您正在更改外观的属性 它管理整个应用程序。所以TableHeader.cellBorder都被修改了。

希望这有帮助。