JTable удалить или скрыть или отключить определенную ячейку?

Мне интересно, возможно ли следующее и как это сделать. Я хотел бы удалить или скрыть или отключить выбор «пустой» ячейки из моей таблицы:

введите здесь описание изображения

Ниже приведен код, который устанавливает модель таблицы, после этого кода я просто заполняю таблицу данными:

myTable.setModel(new javax.swing.table.DefaultTableModel(
        new Object[][]{
            {null, null, null},
            {null, null, null},
            {null, null, null},
            {null, null, null},
            {null, null, null},
            {null, null, null},
            {null, null, null}
        },
        new String[]{
            null, null, null
        }) {
    Class[] types = new Class[]{
        java.lang.String.class, java.lang.String.class, java.lang.String.class
    };
    boolean[] canEdit = new boolean[]{
        false, false, false
    };

    @Override
    public Class getColumnClass(int columnIndex) {
        return types[columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return canEdit[columnIndex];
    }
}); 

person jadrijan    schedule 29.11.2012    source источник
comment
Не могли бы вы объяснить немного больше, что вы имеете в виду, когда скрываете ячейку? вы хотите, чтобы выбор не изменился, если вы нажмете пустую ячейку? Вы хотите изменить отображение ячейки по умолчанию, если она пуста?   -  person schippi    schedule 29.11.2012
comment
это было решено несколько раз здесь о выборе, путем перемещения выбора в другую ячейку, извините, я никогда не использовал и не помню, как ...   -  person mKorbel    schedule 29.11.2012
comment
эту пустую ячейку, я просто хочу скрыть ее или что-то, что, по вашему мнению, является лучшим, чтобы пользователь не мог ее выбрать, но мог выбрать любую непустую ячейку.   -  person jadrijan    schedule 29.11.2012


Ответы (1)


Хорошо, после небольшого взлома, я думаю, у меня есть возможное решение для вас.

table.setCellSelectionEnabled(true);
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setDefaultRenderer(Object.class, new Renderer());

public class Renderer extends DefaultTableCellRenderer {

public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {

    if (table.getValueAt(row, column) == null && isSelected) {
        table.clearSelection();

        return super.getTableCellRendererComponent(table, value, false, false,
                row, column);
    } else {
        return  super.getTableCellRendererComponent(table, value, isSelected,
                hasFocus, row, column);
    }
}

}

это работает, только если у вас есть

table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

включено. и пустая ячейка по-прежнему имеет фокус. но это может быть достаточно хорошо для ваших требований

person schippi    schedule 29.11.2012
comment
я пробовал пару вещей, но я не мог получить правильный столбец в ListSelectionListener. также я не мог удалить ListSelectionListener по умолчанию из модели, поэтому я не мог гарантировать, что deselectListener сработает после прослушивателя, который отвечает за его выбор. - person schippi; 29.11.2012
comment
Извините, но это не имеет смысла. TableModels не имеют прослушивателей выбора. Замена прослушивателя выбора таблиц обновит все подключенные прослушиватели. Вопрос в том, как определить, какая ячейка доступна для выбора. - person MadProgrammer; 30.11.2012
comment
Вот как минимум один пример - person MadProgrammer; 30.11.2012