Я делаю программу простого календаря с графическим интерфейсом. Я показываю представление месяца в календаре с помощью DefaultTableModel и DefaultTableCellRenderer. Мой календарь настроен, чтобы выделить сегодняшнюю дату. Я хотел бы, чтобы он также выделил пользователя, нажатого на дату, с другим цветом. Я подключил мышь к каждой ячейке и могу получить эту дату этих ячеек, но я не знаю, как обновить tblCalendarRenderer (по крайней мере, не правильно). Я получил это, чтобы начать подсвечивать некоторые даты, которые были нажаты одним цветом, но это похоже на любой другой щелчок и выделяет предыдущую дату, на которую я нажал, а не на текущий. Он также начнет выделять несколько, а затем обновится в какой-то момент. Может кто-нибудь, пожалуйста, скажите мне, как выполнить это правильно?DefaultTableModel Выделение на ячейках
Вот код:
public static void monthView(final int month, int year){
//print month calendar
int nod, som; //Number Of Days, Start Of Month
//Clear table
for (int i = 0; i < 6; i++){
for (int j = 0; j < 7; j++){
MyCalendarTester.mtblCalendar.setValueAt(null, i, j);
}
}
if(initial){ // to make sure that the mouse listeners are only created once.
initial = false;
MyCalendarTester.tblCalendar.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent event) {
// TODO Auto-generated method stub
int rowEvent = MyCalendarTester.tblCalendar.getSelectedRow();
int colEvent = MyCalendarTester.tblCalendar.getSelectedColumn();
System.out.print(arrayOfMonths[month].toString() + " ");
MyCalendarTester.realDay = Integer.parseInt(MyCalendarTester.tblCalendar.getValueAt(MyCalendarTester.tblCalendar.convertRowIndexToModel(rowEvent),
MyCalendarTester.tblCalendar.convertColumnIndexToModel(colEvent)).toString());
System.out.print(MyCalendarTester.tblCalendar.getValueAt(MyCalendarTester.tblCalendar.convertRowIndexToModel(rowEvent),
MyCalendarTester.tblCalendar.convertColumnIndexToModel(colEvent)) + " ");
System.out.println(MyCalendarTester.currentYear);
//Apply renderers
MyCalendarTester.tblCalendar.setDefaultRenderer(MyCalendarTester.tblCalendar.getColumnClass(0), new tblCalendarRenderer());
MyCalendarTester.tblCalendar.getCellRenderer(MyCalendarTester.tblCalendar.convertRowIndexToModel(rowEvent), MyCalendarTester.tblCalendar.convertColumnIndexToModel(colEvent));
}
});
//Draw calendar
for (int i=1; i<=nod; i++){
int row = new Integer((i+som-2)/7);
int column = (i+som-2)%7;
MyCalendarTester.mtblCalendar.setValueAt(i, row, column);
}
//Apply renderers
MyCalendarTester.tblCalendar.setDefaultRenderer(MyCalendarTester.tblCalendar.getColumnClass(0), new tblCalendarRenderer());
}
static class tblCalendarRenderer extends DefaultTableCellRenderer{
public Component getTableCellRendererComponent (JTable table, Object value, boolean selected, boolean focused, int row, int column){
super.getTableCellRendererComponent(table, value, selected, focused, row, column);
if (column == 0 || column == 6){ //Week-end
setBackground(new Color(255, 220, 220));
}
else{ //Week
setBackground(new Color(255, 255, 255));
}
if (value != null){
if (Integer.parseInt(value.toString()) == MyCalendarTester.realDay &&
MyCalendarTester.currentMonth == MyCalendarTester.realMonth && MyCalendarTester.currentYear == MyCalendarTester.realYear){ //Today
setBackground(new Color(220, 220, 255));
}
}
setBorder(null);
setForeground(Color.black);
return this;
}
}
Не будет ли код для выделения в коде рендеринга? Здесь могут оказаться полезными логические параметры 'selected' и' focus'. –
@ HovercraftFullOfEels Да! Теперь я чувствую себя глупо ... Не понимаю, что я могу использовать те, которые содержатся в инструкции if в коде визуализации .... oops Спасибо за подсказку! – aurora91