如何删除Jtable标题网格线,我能够从行中删除网格线,但它在jtable标题中给出网格线。是否可以删除Jtable标题网格线。
答案 0 :(得分:3)
是否可以删除JTable标题网格线。
好奇:你为什么要那样做?
现在回答:不,不是。表头呈现取决于TableHeaderUI和Look 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。
正如@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
都被修改了。
希望这有帮助。