JTable с разными типами строк

Я хочу реализовать JTable в своей программе, которая имеет несколько разных строк.

Вот пример:

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

Итак, в основном costs вычисляются так:

Sale * Production * Production % = Costs

В чем я совершенно не уверен: как дать каждой строке в модели JTable новый «тип» столбца. На данный момент я использую модель JTable следующим образом:

public Object getValueAt(int row, int col) {
        Customer cd = customerList.get(row);
        switch (col) {
        case 0:
            return cd.getName();
        case 1:
            return cd.getAge(); 
        case 2:
            return cd.getPhone(); 
        default:
            break;
        }

        return null;
    }

Любые рекомендации, как реализовать этот вариант использования?

Я ценю ваш ответ!


person Carol.Kar    schedule 10.11.2014    source источник
comment
Что вы имеете в виду под типом столбца? Другой тип данных? Разная семантика?   -  person Thomas    schedule 10.11.2014
comment
Вопрос неясен: как дать каждой строке в модели JTable новый тип столбца. Что означает присвоение строке типа столбца?   -  person DSquare    schedule 10.11.2014
comment
TableCellRenderer/Editor имеет параметр для int columnIndex и int rowIndex, используйте эти оба координаты   -  person mKorbel    schedule 10.11.2014
comment
Sale * Production * Production % = Costs можно сделать (лучший из возможных способов) переопределив setValueAt, зачем вы выложили скриншот из MsExcel   -  person mKorbel    schedule 10.11.2014
comment
для лучшей помощи, скорее опубликуйте короткий, исполняемый, компилируемый SSCCE/MCVE с жестко заданным значением в локальной переменной,   -  person mKorbel    schedule 10.11.2014
comment
@Thomas Спасибо за ответ! Посмотрите на мою таблицу Excel. Что я точно имею в виду под другим типом, так это то, что в некоторых строках я могу иметь процент или целое число, тогда как в других какое-то вычисленное значение.   -  person Carol.Kar    schedule 10.11.2014
comment
@DSquare Спасибо за ответ! Под разным типом я подразумеваю, что строка может иметь разные значения внутри, которые зависят от типа строки.   -  person Carol.Kar    schedule 10.11.2014


Ответы (1)


Если вы хотите, чтобы ячейки в строке имели специальное форматирование или тип данных, просто сделайте то, что вы сделали для Customer, и просто поменяйте местами столбец и строку, т.е. я предполагаю, что одна запись в вашей таблице представлена ​​одним столбцом.

Таким образом, просто сделайте что-то вроде этого:

Report report = reports.get(col - 1); //made those names up but you should get the idea
switch (row) {
  ...
  case 5:
    double p = report.getPercentage(); //assuming 10% is stored as 0.1
    return String.format("%.0f%%", p * 100); //%.0f means a floating point number with 0 fraction digits
  ...
}

В качестве альтернативы (особенно если ваша модель должна быть более гибкой или у вас просто есть набор значений, например, в виде двумерного массива), сохраните тип (т.е. как отображать значение) на карте с помощью строки, столбца или ячейки (строка и столбец) индекс в качестве ключа.

Обновление:

Как сказал mKorbel в комментарии, вам лучше позволить средству визуализации выполнить форматирование. Проблема, однако, в том, что вы не можете просто зарегистрировать средство визуализации для каждой строки, поэтому вам придется придумать другое решение.

Два из них всплывают в моей голове прямо сейчас:

  1. Подкласс JTable, чтобы переопределить getCellRenderer(row, col), чтобы предоставить PercentageCellRenderer для строки, которая в нем нуждается. Вам нужно будет настроить, какая строка, например. в настольной модели.

  2. Предоставьте стандартное средство визуализации ячеек, которое проверяет строку и столбец в getTableCellRendererComponent() и соответствующим образом применяет форматирование.

person Thomas    schedule 10.11.2014
comment
return String.format("%.0f%%", p * 100); ???, getValueAt используется для TableCellRenderer не проще переопределить getColumnClass с помощью Double.Class и отформатировать Double в pct form путем переопределения XxxRenderer, я бы удалил этот ответ как *** - person mKorbel; 10.11.2014
comment
без SSCCE/MCVE все о выстрелах в темноту - person mKorbel; 10.11.2014
comment
@mKorbel хорошо, установка класса столбца на Double.class может быть недостаточной, так как f.e. costs может потребоваться другое форматирование. Однако вы правы, позволяя рендереру выполнять форматирование, но, поскольку OP, кажется, сбит с толку даже простыми вещами, я попытался дать настолько простой ответ, насколько мог придумать в то время. - person Thomas; 10.11.2014
comment
@mKorbel еще одна проблема заключается в том, что столбец не имеет определенного класса, т. Е. Он может содержать целые числа, а также двойные числа. По крайней мере, я так понимаю ОП. - person Thomas; 10.11.2014
comment
@ Томас Да, это полностью проблема! - person Carol.Kar; 11.11.2014
comment
Полный пример с использованием средств визуализации по умолчанию рассматривается здесь. - person trashgod; 11.11.2014