のデフォルトはありませんTableCellRenderer
。指定するBufferedImage
必要があります
から拡張された新しいクラスを自分で作成しますDefaultTableCellRenderer
。getTableCellRendererComponent
メソッドをオーバーライドする
このメソッドでは、渡された値が であることを確認しBufferedImage
、そうである場合は のインスタンスを作成し、をそれImageIcon
に渡しますBufferedImage
。
cell renderessetIcon
メソッドを使用して、新しいインスタンスImageIcon
をそれに渡します
テーブル インスタンスで、メソッドを使用してセル レンダラーをクラスsetDefaultRenderer
に関連付けます。BufferedImage
table.setDefaultRenderer(BufferedImage.class, myInstanceOfBufferedImageCellRenderer)
詳細については、カスタム レンダラーの使用をご覧ください。
例を追加
そこで、私と Hovercraft の両方のアイデアを使用して、簡単な例をまとめました。

ImageIcon
個人的には、Hovercraft のアイデアは、 1 つずつ作成BufferedImage
してその参照を維持する限り、セル レンダラーを使用するよりも少ないリソースを使用し、高速になると思います。
カスタム セル レンダラーに同じことをさせることもできますが、とWeakHashMap
の間の参照を維持するために s をいじる必要があり、問題の が収集されず、参照がぶらぶらしたままになるというリスクがまだあります。BufferedImage
Icon
BufferedImage
Icon
レンダリングの方法で特別なことをしていない場合はBufferedImage
、使いやすさとリソース管理の観点から、Hovercraft の提案を使用します。
public class BufferedImageTableCellRenderer {
public static void main(String[] args) {
new BufferedImageTableCellRenderer();
}
public BufferedImageTableCellRenderer() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
File[] files = new File("some folder some where").listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
String name = pathname.getName().toLowerCase();
return name.endsWith(".gif") || name.endsWith(".jpg") || name.endsWith(".png");
}
});
ImageTableModel model = new ImageTableModel();
for (File file : files) {
try {
model.add(ImageIO.read(file));
} catch (IOException ex) {
ex.printStackTrace();
}
}
JTable table = new JTable(model);
table.setRowHeight(100);
table.setDefaultRenderer(BufferedImage.class, new BufferedImageCellRenderer());
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class BufferedImageCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (value instanceof BufferedImage) {
setIcon(new ImageIcon((BufferedImage)value));
setText(null);
} else {
setText("Bad image");
}
return this;
}
}
public class ImageTableModel extends AbstractTableModel {
private List<BufferedImage> images = new ArrayList<>(25);
private List<Icon> icons = new ArrayList<>(25);
@Override
public int getRowCount() {
return images.size();
}
public void add(BufferedImage image) {
images.add(image);
icons.add(new ImageIcon(image));
fireTableRowsInserted(images.size() - 1, images.size() - 1);
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object value = null;
switch (columnIndex) {
case 0:
value = images.get(rowIndex);
break;
case 1:
value = icons.get(rowIndex);
break;
}
return value;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
Class clazz = String.class;
switch (columnIndex) {
case 0:
clazz = BufferedImage.class;
break;
case 1:
clazz = Icon.class;
break;
}
return clazz;
}
@Override
public String getColumnName(int column) {
String name = null;
switch (column) {
case 0:
name = "BufferedImage";
break;
case 1:
name = "Icon";
break;
}
return name;
}
}
}