2012-01-23 2 views
1

Я пытаюсь реализовать пользовательский TableCellRenderer на jtable. в таблице установлено 100 строк и 100 столбцов. Эта таблица должна содержать все глифы для указанного шрифта. Моя проблема заключается в том, что когда таблица не полностью заполнена значениями, в первом столбце она помещает последнее значение, пока оно не достигнет нижней части таблицы. Ниже у меня есть код для моего собственного рендерера и скриншот со странным поведением. Любая помощь будет оценена.TableCellRenderer странное поведение java

enter image description here

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; 
} 
+1

Несмотря на то, что ваш рендерер очень избыточен, это, по-видимому, не является причиной вашей проблемы. – stryba

+0

Данные, передаваемые вашему рендерингу, поступают из 'TableModel', поэтому, скорее всего, именно там и возникла проблема. Отправьте этот код вместо кода рендеринга – Robin

+0

Ваш код, похоже, не вызывает table.setValueAt (btw рендереру не следует изменять содержимое таблицы); Поэтому я думаю, что проблема в том, как заполняется таблица. –

ответ

2

1) есть около Unicode гольцов, я думаю, что это не работа для Renderer

2) установить JTable#Font для JTable, а что передачи параметров для Renderer

3) используйте prepareRenderer, если вы хотите изменить кучу данных в Runtime

4) Самое главное было бы посмотреть, как вы заполнили JTable's данные и определить/комплект для Font(s)

2

Я не думаю, что ваша проблема является CellRenderer ..

Но я очистил его немного для вас

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)); 
     setFont(desired_font); 

     if (value == null) 
     { 
      setText(""); 
     } 
     else 
     { 
      setText(value.toString()); 
     } 

     if (isSelected) 
     { 
      setBackground(new Color(56, 195, 254)); 
     } 

     //what was that for? 
     //table.setValueAt(null, rowIndex, vColIndex); 

     return this; 
    } 
} 
2

Как и в сторону, canDisplay(int) может помочь определить, имеет ли конкретная кодовая точка глиф в заданном Font. REPLACEMENT CHARACTER является удобным заполнителем, а GlyphSet является родственным примером.

+0

Прежде всего спасибо за quck ответов – Andrei

+0

вот код, где я заполнить таблицу – Andrei

+0

время (cnt_i <100) { в то время как (cnt_j <100) { если (my_fnt.canDisplay ((символ) 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; } – Andrei

Смежные вопросы