Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Рендерер для JTable / 6 сообщений из 6, страница 1 из 1
24.07.2007, 12:13:42
    #34679585
Lord Carlsberg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендерер для JTable
Доброго времени суток!
Есть массив int. Для вывода его содержимого на экран использую JTable. В зависимости от того, какое число записано в тот или иной элемент массива, в соответствующую ячейку таблицы должна рисоваться та или иная иконка. При реализации всего вышесказанного создал класс, реализующий модель таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 public   class  MyTableModel  extends  AbstractTableModel
{
...
	 public  Object getValueAt( int  arg0,  int  arg1)
	{
		 switch (squares[arg0][arg1])
		{
		 case  - 1 :
			 return   new  ImageIcon("FirstIcon.gif");
		 case   1 :
			 return   new  ImageIcon("SecondIcon.gif");
		 default :
			 return   null ;
		}
	}
...
	 private   int  tableArray[][]; //массив для вывода в таблицу
}
Также создал класс-рендерер для отрисовки иконок в ячейках таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public   class  IconTableCellRenderer  implements  TableCellRenderer {

	 public  Component getTableCellRendererComponent(JTable table, Object icon,
			 boolean  isSelected,  boolean  hasFocus,  int  row,  int  column) {
		JLabel label =  new  JLabel((ImageIcon) icon);
		 return  label;
	}

}
и соответственно назначил его для отрисовки ImageIcon в ячейках таблицы
Код: plaintext
1.
2.
3.
...
	table.setDefaultRenderer(ImageIcon. class ,  new  IconTableCellRenderer());
...
Но иконки в ячейках таблицы не отрисовывались. Я проверил класс объектов в ячейках таблицы. Выяснилось, что в ячейках таблицы содержатся объекты класса Object. Впринципе логично, т.к. метод getValueAt модели таблицы возвращает Object. Я попытался определить этот метод так, чтобы он возвращал ImageIcon:
Код: plaintext
1.
2.
3.
...
 public  ImageIcon getValueAt( int  arg0,  int  arg1)
...
В ответ на это компиллятор сильно заругался. Отсюда возникает вопрос: каким образом нужно создать и назначить таблице рендерер для отрисовки иконок (да и любых других объектов вообще), если таблица объекты любого класса в ячейках "видит" как Object.
Заранее балгодарен.
...
Рейтинг: 0 / 0
24.07.2007, 12:19:05
    #34679605
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендерер для JTable
переопределите метод getColumnClass()
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
24.07.2007, 12:28:59
    #34679647
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендерер для JTable
механизм getColumnClass() можнообойти если принудительно назначать рендереры на колонки ...

и почиайте что ннить по свингу - первыt два куска кода просто фатальные
...
Рейтинг: 0 / 0
24.07.2007, 12:32:31
    #34679666
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендерер для JTable
Код: plaintext
1.
    JLabel label =  new  JLabel((ImageIcon) icon);
     return  label;

вот так вот не стоит делать, для отрисовки каждой cell создавать новый объект JLabel, наследуйтесь от какого-нибудь дефолтного reneder или от JLabel
...
Рейтинг: 0 / 0
24.07.2007, 19:36:21
    #34681454
Lord Carlsberg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендерер для JTable
Deady
переопределите метод getColumnClass()
Posted via ActualForum NNTP Server 1.4
Мде... И как я сразу не догадался? :)

vas0
Код: plaintext
1.
    JLabel label =  new  JLabel((ImageIcon) icon);
     return  label;

вот так вот не стоит делать, для отрисовки каждой cell создавать новый объект JLabel, наследуйтесь от какого-нибудь дефолтного reneder или от JLabel
Большое спасибо за совет. Переделал рендерер следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public   class  IconTableCellRenderer  extends  JLabel  implements  TableCellRenderer {

	 public  Component getTableCellRendererComponent(JTable table, Object icon,
			 boolean  isSelected,  boolean  hasFocus,  int  row,  int  column) {
		setIcon((ImageIcon) icon);
		 return   this ;
	}

}
Аналогично, чтобы не штамповать ImageIcon при каждом вызове getValueAt, переделал модель:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 public   class  MyTableModel  extends  AbstractTableModel
{
...
	 public  Object getValueAt( int  arg0,  int  arg1)
	{
		 switch (tableArray[arg0][arg1])
		{
		 case  - 1 :
			 return  firstIcon;
		 case   1 :
			 return  secondIcon;
		 default :
			 return   null ;
		}
	}
...
	 private   int  tableArray[][]; //массив для вывода в таблицу
	 private  ImageIcon firstIcon =  new  ImageIcon("FirstIcon.gif");
	 private  ImageIcon secondIcon =  new  ImageIcon("SecondIcon.gif");
}

exppмеханизм getColumnClass() можнообойти если принудительно назначать рендереры на колонки ...

и почиайте что ннить по свингу - первыt два куска кода просто фатальные
Если не затруднит, объясните пожалуйста поподробнее, что именно в них фатального?
...
Рейтинг: 0 / 0
24.07.2007, 20:09:05
    #34681529
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендерер для JTable
нехорошо насиловать GC

правильно пофиксил
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Рендерер для JTable / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]