0

JTableに画像を挿入する際に問題が発生しました。私は検索し、2つの方法があることを発見しました。テーブルモデルのgetcolumnclassをオーバーライドするか、カスタムテーブルセルレンダーを作成できます。

私はこのコードで自分のセルレンダラーを作成することを選択しました:

public class MyRenderer extends DefaultTableCellRenderer {

    /*
     * @see TableCellRenderer#getTableCellRendererComponent(JTable, Object, boolean, boolean, int, int)
     */
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                 boolean isSelected, boolean hasFocus, 
                                                 int row, int column) {
      ImageIcon icon = new ImageIcon("Images/green.png");
      setText((String)value);
      setIcon(icon);
      return this;
    }
}

テーブルのフィールドに入力する方法では、この行で画像を追加しています。

laneTable.getColumnModel().getColumn(4).setCellRenderer(new MyRenderer());

問題は、画像が空白の空白として表示されていることです。行を選択すると、4番目の列(画像のある列)を除いてすべてのフィールドが青で強調表示されるため、間違いなく何かがレンダリングされます。なぜ画像が表示されないのか、一生理解できません。行の高さをさまざまな方法で調整して、画像がそこにあるかどうかを確認しましたが、見えないか何かがあります。そうではないようです。

オーバーライドメソッドも実行しようとしましたが、netbeansが構文エラーを出していたため、構文が正しく実行されなかったと思います。また、実行方法に関する適切な例をまだ見つけていません。

ありがとう。

編集:以下のコードを使用してクラスをオーバーライドする、より簡単な方法を試しましたが、セルはまだ空白です。そして、ラベルへの画像の挿入をテストしましたが、それらは機能するので、パスは正しいです。

           @Override
        public Class getColumnClass(int column)
        {

            if (column == 4)
            {

                return ImageIcon.class;
            }
            return Object.class;
            // other code; default to Object.class
        }
4

1 に答える 1

5

このコードを使用して、独自のセル レンダラーを作成することにしました。

なぜ車輪を再発明するのですか?ご覧のとおり、問題が発生しているため、デフォルトのレンダラーを使用して getColumnClass() メソッドをオーバーライドしてください。

また、rednering コードで画像を読み取ることは決してありません。

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableIcon extends JFrame
{
    public TableIcon()
    {
        ImageIcon aboutIcon = new ImageIcon("about16.gif");
        ImageIcon addIcon = new ImageIcon("add16.gif");
        ImageIcon copyIcon = new ImageIcon("copy16.gif");

        String[] columnNames = {"Picture", "Description"};
        Object[][] data =
        {
            {aboutIcon, "About"},
            {addIcon, "Add"},
            {copyIcon, "Copy"},
        };

        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable( model )
        {
            //  Returning the Class of each column will allow different
            //  renderers to be used based on Class
            public Class getColumnClass(int column)
            {
                return getValueAt(0, column).getClass();
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        TableIcon frame = new TableIcon();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
    }

}

アップデート:

多分これは理解しやすいです:

public Class getColumnClass(int column)
{
//  return getValueAt(0, column).getClass();
    return (column == 0) ? Icon.class : Object.class;
}
于 2011-06-24T19:20:09.437 に答える