Как удалить линии сетки Jtable Header, я могу удалить линии сетки из строк, но она дает линии сетки в заголовке jtable. Можно ли удалить строки сетки заголовка Jtable.
Можно ли удалить строки сетки заголовка JTable.
Просто любопытно: Зачем вы хотите это сделать?
Теперь ответ: Нет, нет. Редактирование заголовка таблицы зависит от реализации TableHeaderUI, предоставляемой визуализатором Look and Feel и JTableHeader. Вы можете сказать рендеру, что вы не хотите границ, но если L & F использует пользовательский художник с границами (fi: 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: например, это не будет работать с нимбом.
Как указано в @blackbishop, вы можете использовать UIManager для установки свойства, чтобы сообщить L & F, что он не должен рисовать границы ячеек заголовка таблицы. Однако нет никакого соглашения об этих свойствах (каждый L & F имеет свои собственные свойства), и большинство L & F, вероятно, их игнорируют.
Может быть, вы можете это сделать с помощью UIManager
UIManager.getDefaults().put("TableHeader.cellBorder" , BorderFactory.createEmptyBorder(0,0,0,0));
Примечание. Это не изменит границы ячейки TableHeader одного JTable, но для всех JTables в вашем приложении. Это потому, что вы меняете атрибут Look and Feel, который управляет всем приложением. Так что все TableHeader.cellBorder
изменены.
Надеюсь это поможет.
См. JTableHeader без линий сетки:
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;
}
}