0

セルの内容に応じて画像を表示したいJTableがあります。これを達成するには、すでに持っている独自のカスタムセルレンダラーを実装する必要があることを理解していますが、最初の画像が表示されるとすぐにプログラムはセルの内容に関係なく、他のセルに画像を描画します。私はほとんどすべてを試しましたが、インターネットで解決策を探しましたが、すべて役に立ちませんでした。これが私のコードです:

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

私がそれらの線に沿ってどこかでばかげたことをしているなら、私を許してください. . .

前もってありがとう、ジグ。

4

1 に答える 1

4

呼び出すことを忘れないでください:

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

メソッドの開始時に、レンダラーのデフォルト設定を取得します。

上記で問題が解決しない場合は、コードを次のようにする必要があります。

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

また、レンダラーで画像を読み取らないでください。render は複数回呼び出されるため、毎回画像を読み取る必要はありません。クラスのコンストラクターでイメージを読み取ります。

于 2013-05-28T01:01:39.573 に答える