我在将图像插入JTable时遇到问题。我搜索过,发现有两种方法。您可以覆盖tablemodel的getcolumnclass,也可以创建自定义tablecellrender。
我选择使用以下代码创建自己的单元格渲染器:
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
}
答案 0 :(得分: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;
}