Обрабатывать всю строку в TableCellRenderer

#java #swing #tablecellrenderer

#java #качать #tablecellrenderer

Вопрос:

Я реализую TableCellRenderer, чтобы сделать видимую разницу, является ли последнее значение определенным значением или нет.

Итак, код этой реализации является:

     TableColumnModel tcm = table.getColumnModel();
    TableColumn col = tcm.getColumn(column);

    JLabel cellComponent = new JLabel();
    if (value != null)
    {
        cellComponent.setText( String.valueOf( value ) );
    }else
        cellComponent.setText( "-" );

    String colName = (String) col.getHeaderValue(); 
    if (colName.startsWith("Vigencia") amp;amp; !cellComponent.getText().equals("-"))
    {
        long dias = Long.valueOf(cellComponent.getText());
        if (dias <0)
        {
            dias = dias -(dias*2); //Le resto (dias x 2) para sacarle el negativo...

            cellComponent.setText( String.valueOf(dias) );
            cellComponent.setBorder( BorderFactory.createLineBorder(Color.RED));
        }
    }
  

чтобы заполнить мою таблицу, у меня есть класс, который расширяется от JTable, и у меня есть этот метод для заполнения таблицы:

 public void setData(LinkedList<T> list)
{
    if (list.size() == 0)
    {
        cleanTableData();
        return;
    }

    int index = 0;
    Object[][] o = new Object[list.size()][_columnNames.length];
    for (T obj : list)
    {
        Object[] data = obj.toStringReporte();
        o[index  ] = data;
    }
    _tableModel = new DefaultTableModel( o, _columnNames );
    setModel(_tableModel);
    setColumnWidths();
}
  

Это метод toStringReporte:

 public Object[] toStringReporte()
{
    String planName = "-";
    if (getPlanID() != null)
    {
        Plan plan = Adapter.getInstance().getElement(getPlanID(), new Plan());
        planName = plan.getNombre();
    }

    return new Object[]{getID(), 
                        getNombre(), 
                        getApellido(), 
                        getDni(), 
                        (getEstado().equals("A") ? "Activo" : "Inactivo"), 
                        (getSexo().equals("M") ? "Masculino" : "Femenino"),
                        (getFichaMedica() != null ? new SimpleDateFormat(Defines.DATE_FORMAT).format(new Date(getFichaMedica())) : "-"),
                        planName,
                        (getFechaVencimiento() != null ? SGGDateUtils.diferenceInDaysBetweenTwoDatesMS(getFechaVencimiento(), new Date().getTime()) : "-")};
}
  

Моя проблема в том, что (как подсказывает название класса) единственное изменение — это граница ячейки. Я хочу изменить всю границу строки.

Какой-нибудь орган знает, как изменить границу всей строки?

Комментарии:

1. JTable по умолчанию возвращает JLabel из ячейки, и если вы не помещаете какие-либо J-компоненты внутри TbaleCell или TbaleColumn, тогда вам придется искать реализации для prepareRenderer

2. в стороне: храните данные в модели, а не в ее строковом представлении. Преобразование типов данных модели в строки является задачей xxRenderer

Ответ №1:

Рендеринг строки таблицы показывает, как можно отобразить границу уровня строки.

Ответ №2:

Вы не можете сделать это только с помощью TableCellRenderer, поскольку он работает независимо для каждой ячейки.

Если вы хотите применить эффект ко всей строке, вам, вероятно, потребуется переопределить метод prepareRenderer JTable.