как удалить линии сетки заголовка Jtable

1

Как удалить линии сетки Jtable Header, я могу удалить линии сетки из строк, но она дает линии сетки в заголовке jtable. Можно ли удалить строки сетки заголовка Jtable.

  • 1
    да, есть границы, но событие мыши будет подсвечивать только один столбец, для этого требуется большая часть кода, удалить JTableHeader и поместить туда JMenuBar (BoxLayout) с JLabel ??? вместо :-)
  • 0
    @mKorbel не могли бы вы предоставить пример кода для удаления линий сетки из заголовка jtable
Теги:
swing

3 ответа

3

Можно ли удалить строки сетки заголовка 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: например, это не будет работать с нимбом.

Игра с свойствами UIManager

Как указано в @blackbishop, вы можете использовать UIManager для установки свойства, чтобы сообщить L & F, что он не должен рисовать границы ячеек заголовка таблицы. Однако нет никакого соглашения об этих свойствах (каждый L & F имеет свои собственные свойства), и большинство L & F, вероятно, их игнорируют.

2

Может быть, вы можете это сделать с помощью UIManager

UIManager.getDefaults().put("TableHeader.cellBorder" , BorderFactory.createEmptyBorder(0,0,0,0));

Примечание. Это не изменит границы ячейки TableHeader одного JTable, но для всех JTables в вашем приложении. Это потому, что вы меняете атрибут Look and Feel, который управляет всем приложением. Так что все TableHeader.cellBorder изменены.

Надеюсь это поможет.

  • 0
    это сработало для меня, и это очень простой код для применения ко всем jtables в приложении
2

См. 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;
    }
}
  • 0
    это не удалит линии сетки из заголовка таблицы, но удалит линии сетки из строк jtable.
  • 0
    Как я уже сказал, посмотрите на более длинный пример. Работает для меня. Код добавлен в мой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню