Я пытаюсь реализовать пользовательский TableCellRenderer на jtable. в таблице установлено 100 строк и 100 столбцов. Эта таблица должна содержать все глифы для указанного шрифта. Моя проблема заключается в том, что когда таблица не полностью заполнена значениями, в первом столбце она помещает последнее значение, пока оно не достигнет нижней части таблицы. Ниже у меня есть код для моего собственного рендерера и скриншот со странным поведением. Любая помощь будет оценена.TableCellRenderer странное поведение java
public class FontRenderer extends JLabel implements TableCellRenderer
{
Font desired_font;
Object prec_value;
public FontRenderer(Font f)
{
desired_font = f;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex)
{
setOpaque(true);
setHorizontalAlignment(SwingConstants.CENTER);
setBackground(new Color(255, 255, 255));
if (isSelected)
{
if (value == null)
{
setText("");
}
else
{
setText(value.toString());
}
setFont(desired_font);
setBackground(new Color(56, 195, 254));
}
if (value == null)
{
setText("");
}
else
{
if(value==null)
table.setValueAt(null, rowIndex, vColIndex);
else
setText(value.toString());
//table.setValueAt(value.toString(), rowIndex, vColIndex);
}
setFont(desired_font);
return this;
}
}
Edit: Вот код, где я заполнить таблицу.
while (cnt_i < 100) {
while (cnt_j < 100) {
if (my_fnt.canDisplay((char) unicode_char) && glyph_count <= total_glyphs) {
jTable1.setValueAt((char) unicode_char, cnt_i, cnt_j);
cnt_j++;
if (glyph_count == total_glyphs) {
break;
}
glyph_count++;
}
unicode_char++;
}
cnt_i++;
cnt_j = 0;
}
Решено. Ты все. именно так я заполнил таблицу. следующий код имеет изменения:
while (cnt_i < 100) {
while (cnt_j < 100) {
if (my_fnt.canDisplay((char) unicode_char) && glyph_count <= total_glyphs) {
if (glyph_count == total_glyphs) {
break;
}
else {
jTable1.setValueAt((char) unicode_char, cnt_i, cnt_j);
cnt_j++;
glyph_count++;
}
}
unicode_char++;
}
cnt_i++;
cnt_j = 0;
}
Несмотря на то, что ваш рендерер очень избыточен, это, по-видимому, не является причиной вашей проблемы. – stryba
Данные, передаваемые вашему рендерингу, поступают из 'TableModel', поэтому, скорее всего, именно там и возникла проблема. Отправьте этот код вместо кода рендеринга – Robin
Ваш код, похоже, не вызывает table.setValueAt (btw рендереру не следует изменять содержимое таблицы); Поэтому я думаю, что проблема в том, как заполняется таблица. –