Здравствуйте, суть задачи: есть перечень номеров в гостинице, интервал дат в xml файле.
в JTable вида:
----------------- days ------------------
rooms | 1 2 3 4 5 6 7 8 9 . . . 31 |
1 |
2 |
3 |
столбец rooms формируется из xml, если в номере живет человек, количество days 1..n из выбранного интервала datein, dateout в JDateChooser. rows заполняются " ". Что требуется: допустим человек живет в номере 2 с 3 числа по 5, следовательно необходимо задать фон ячеек на пересечении 2 строки и столбцов с 3 по 5, прилагаю код.
Модель таблицы:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public class JTableMapModel extends AbstractTableModel {
Vector<Integer> cols;
Vector<String> rows;
int in;
int out;
public JTableMapModel(int dateFrom, int dateTo) throws JAXBException, FileNotFoundException {
cols = new Vector<Integer>();
rows = new Vector<String>();
JAXBReadWriteObject jaxbReadWriteObject = new JAXBReadWriteObject();
Writes unmarshalledObject = jaxbReadWriteObject.createUnmarshalledObject();
cols.add(0, 1);
for (int i = 0; i < unmarshalledObject.getRoomsList().toArray().length; i++) { //прохожу по всему файлу,
if (unmarshalledObject.getRoomsList().get(i).getState() == 2) { // только занятые номера
in = unmarshalledObject.getRoomsList().get(i).getClient().get(0).getBill().getDatein().get(Calendar.DAY_OF_MONTH); // дата заселения
out = unmarshalledObject.getRoomsList().get(i).getClient().get(0).getBill().getDateout().get(Calendar.DAY_OF_MONTH); //дата выезда
for (int z = dateFrom; dateFrom <= dateTo; dateFrom++) {
cols.addElement(dateTo - dateFrom + z); // формирую столбцы от начальной даты до конечной в JDateChooser-ах
Collections.sort(cols);
}
setValueAt(unmarshalledObject.getRoomsList().get(i).getRoomnam() + "", i, 0); //заполнение строк нулевого столбца номерами комнат
for (int x = 0; x < getColumnCount(); x++) {
rows.addElement(""); // ячейки
}
}
}
}
Задаю фон ячейкам:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
JButtonShow.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
in = JDateChooserDateFrom.getCalendar().get(Calendar.DAY_OF_MONTH);
out = JDateChooserDateTo.getCalendar().get(Calendar.DAY_OF_MONTH);
try {
JTableMap.setModel(new JTableMapModel(in, out)); //модель с выбранными датами в gui
JTableMap.getColumnModel().getColumn(0).setHeaderValue("rooms");
for (int i = 0; i < unmarshalledObject.getRoomsList().toArray().length; i++) {
if (unmarshalledObject.getRoomsList().get(i).getState() == 2) {
// дата заезда клиента (от)
datein = unmarshalledObject.getRoomsList().get(i).getClient().get(0).getBill().getDatein().get(Calendar.DAY_OF_MONTH);
//дата выезда (до)
dateout = unmarshalledObject.getRoomsList().get(i).getClient().get(0).getBill().getDateout().get(Calendar.DAY_OF_MONTH);
while (datein <= dateout) { //тут пытаюсь закрасить ячейки..
JTableMap.getColumnModel().getColumn(datein).setCellRenderer(new ColorizeCell(i, datein));
datein++;
}
}
}
contentPane.updateUI();
} catch (JAXBException e1) {
e1.printStackTrace();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
}
}
Cell renderer:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class ColorizeCell extends DefaultTableCellRenderer implements TableCellRenderer {
private int x;
private int y;
ColorizeCell(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if ((row == this.x) && (column == this.y)) {
cell.setBackground(Color.red);
} else cell.setBackground(Color.white);
return cell;
}
}
содержимое xml;
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
<list>
<roomsList id="1">
<roomnam>1</roomnam>
<state>2</state>
<client>
<name>test</name>
<last_name>test</last_name>
<sex>M</sex>
<age>1</age>
<bill>
<datein>2012-04-01T21:24:53.357+02:00</datein>
<dateout>2012-04-05T21:24:53.360+02:00</dateout>
<sum>50</sum>
</bill>
</client>
</roomsList>
<roomsList id="2">
<roomnam>2</roomnam>
<state>2</state>
<client>
<name>etst</name>
<last_name>etst</last_name>
<sex>M</sex>
<age>1</age>
<bill>
<datein>2012-04-04T21:29:48.765+02:00</datein>
<dateout>2012-04-08T21:29:48.766+02:00</dateout>
<sum>20</sum>
</bill>
</client>
</roomsList>
<roomsList id="3">
<roomnam>3</roomnam>
<state>2</state>
<client>
<name>test</name>
<last_name>etst</last_name>
<sex>M</sex>
<age>2</age>
<bill>
<datein>2012-04-07T12:48:01.640+02:00</datein>
<dateout>2012-04-10T12:48:01.642+02:00</dateout>
<sum>0</sum>
</bill>
</client>
</roomsList>
Проблема: закрашиваются ячейки для
roomnam = 1 - с 1 по 3, (1 строка)
для roomnam = 2 - с 4 по 6, (2 строка)
для roomnam = 3 - с 7 по 10 (3 строка)
в xml даты 1-5, 4-8, 7-10 для 1,2,3 строк соответственно, то есть пересекающиеся значения при окрашивании выкидываются, в чем ошибка? как правильно задать фон ячейкам? (с 1 столбца по 5 1-ой строки, далее переход на 2 строку, столбцы с 4 по 8 и т.д.)
извините за простыню, не знал как короче объяснить, подозреваю что проблема в цикле while где создаю экземпляр cell renderer'a.
Спасибо.