2011-06-24 31 views
0

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

私はこのコードで自分のセルレンダリングを作ることにしました:私は私のテーブルのフィールドに入力する方法では

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 
     } 

答えて

5

..

なぜ車輪の再発明?表示されているように問題が発生しているので、デフォルトのレンダラーを使用してgetColumnClass()メソッドをオーバーライドしてください。

また、イメージを変更するコードでは決して読んでいません。

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

おっと、あなたは私よりも高速です。 – camickr

+0

オーバーライドを使って画像をレンダリングする方法が表示されません.... – JMD

+0

@Jesse:オーバーライドは、指定した列の最初のセルのオブジェクトのクラスを列全体のクラスとして使用することを意味しています。そのセルのモデル値は 'ImageIcon'なので、' ImageIcon.class'を返します。 –