TableCellRenderer
для BufferedImage
по умолчанию нет, вам придется его указать
Создайте себе новый класс, который расширяется от DefaultTableCellRenderer
. Переопределить метод getTableCellRendererComponent
В этом методе проверьте, что переданное значение является BufferedImage
, если это так, создайте экземпляр ImageIcon
, передав ему BufferedImage
.
Используйте метод cell renderes setIcon
, передав ему новый экземпляр ImageIcon
В вашем экземпляре таблицы используйте метод setDefaultRenderer
, чтобы связать средство визуализации ячеек с классом BufferedImage
.
table.setDefaultRenderer(BufferedImage.class, myInstanceOfBufferedImageCellRenderer)
Ознакомьтесь с разделом Использование пользовательских средств визуализации для получения дополнительной информации.
Добавлен пример
Итак, я собрал быстрый пример, используя обе идеи от себя и от Hovercraft.
![введите здесь описание изображения](https://i.stack.imgur.com/EFZwu.png)
Мое личное мнение заключается в том, что идея Hovercraft будет использовать меньше ресурсов и работать быстрее, чем использование модуля рендеринга ячеек, если вы создаете ImageIcon
один раз для каждого 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;
}
}
}
person
MadProgrammer
schedule
10.02.2013