2013-05-28 78 views
0

我有一個JTable,我想顯示一個圖像取決於單元格的內容,我明白爲了完成這個我必須實現我自己的自定義單元格渲染器,但是,只要在單元格上繪製第一個圖像,程序就會在其他單元格上繪製圖像,而不管其內容如何。我已經嘗試了幾乎所有東西,並且也在互聯網上尋找解決方案,但都無濟於事。這裏是我的代碼:JTable自定義TableCellRenderer顯示圖像

public class GameBoard extends JTable 
{ 
public GameBoard() 
{ 
    super(new GameBoardModel()); 
    setFocusable(false); 
    setCellSelectionEnabled(true); 
    setRowHeight(26); 

    TableColumn column = null; 
    for (int i = 0; i < getColumnCount(); i++) 
    { 
     column = getColumnModel().getColumn(i); 
     column.setPreferredWidth(26); 
    } 

    setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    setDefaultRenderer(Object.class, new CellRenderer()); 
} 

private class CellRenderer extends DefaultTableCellRenderer 
{ 
    private CellRenderer() 
    { 
     setHorizontalAlignment(JLabel.CENTER); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, 
      Object value, boolean isSelected, boolean hasFocus, int row, 
      int column) 
    { 
     if (value.toString().equals("X")) 
     { 
      URL test = getClass().getResource(resources/icon.png"); 
      setIcon(new ImageIcon(test)); 
     } 
     else 
      setText(value.toString()); 

     return this; 
    } 
} 

請原諒我,如果我在這些行的某處愚蠢的東西。 。 。

在此先感謝, 曲折。讓您得到渲染器的默認設置的方法開始

super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

回答

4

不要忘記調用。

如果上面沒有解決問題,然後你的代碼可能需要是這樣的:

if (value.toString().equals("X")) 
{ 
    URL test = getClass().getResource(resources/icon.png"); 
    setIcon(new ImageIcon(test)); 
    setText(""); 
} 
else 
{ 
    setIcon(null); 
    setText(value.toString()); 
} 

而且,你永遠不應該在渲染器讀取圖像。渲染被多次調用,所以你不想每次都讀取圖像。閱讀該類的構造函數中的圖像。

+0

'UIManager.getIcon(「html.pendingImage」)'是一個方便的佔位符。 – trashgod

+0

我要感謝你一百萬次,我不能相信的東西真是太傻了造成這個問題很多XD,這個固定對我來說: 如果(value.toString()等於(「X」)){ setIcon(new ImageIcon(test)); setText(「」); } else { setIcon(null); setText(value.toString()); } – user2426634

相關問題