2012-01-23 65 views
1

我想在jtable上實現一個自定義的TableCellRenderer。該表被設置爲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; 
} 
} 

編輯:這是我填充該表的代碼。

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#FontJTable寧可傳遞參數Renderer

工作3)使用prepareRenderer如果你想改變運行時的一堆數據

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((char)的Unicode字符的代碼) && glyph_count <= total_glyphs) { jTable1.setValueAt((char)unicode_char,cnt_i,cnt_j); cnt_j ++;如果(glyph_count == total_glyphs) { break; } glyph_count ++; } unicode_char ++; } cnt_i ++; cnt_j = 0; } – Andrei