我有一个JTable并在JTable和其他属性中将图片设置为背景我使用了这段代码。
tblMainView= new JTable(dtModel){
public Component prepareRenderer(TableCellRenderer renderer, int row,
int column)
{
Component c = super.prepareRenderer( renderer, row, column);
// We want renderer component to be transparent so background image
// is visible
if( c instanceof JComponent )
((JComponent)c).setOpaque(false);
return c;
}
ImageIcon image = new ImageIcon( "images/watermark.png" );
public void paint( Graphics g )
{
// First draw the background image - tiled
Dimension d = getSize();
for( int x = 0; x < d.width; x += image.getIconWidth() )
for( int y = 0; y < d.height; y += image.getIconHeight() )
g.drawImage( image.getImage(), x, y, null, null );
// Now let the regular paint code do it's work
super.paint(g);
}
public boolean isCellEditable(int rowIndex, int colIndex) {
return false;
}
public Class getColumnClass(int col){
if (col == 0)
{
return Icon.class;
}else if(col==7){
return String.class;
} else
return String.class;
}
public boolean getScrollableTracksViewportWidth() {
if (autoResizeMode != AUTO_RESIZE_OFF) {
if (getParent() instanceof JViewport) {
return (((JViewport)getParent()).getWidth() > getPreferredSize().width);
}
}
return false;
}
};
tblMainView.setOpaque(false);
每件事都正常运作。但是当我选择一行时,行数据会隐藏。它会显示我的行
我希望结果与此相同, dtModel 是我的 JTable 的 deafultTableModel ,名为 tblMainView
答案 0 :(得分:6)
覆盖prepareRenderer()
是一种recommended方法,可以为整个表格行进行自定义渲染,但是无法让它完成所有操作。特别是,Icon
的{{3}}应该按照您的意愿行事,而且根本没有理由覆盖paint()
。
附录:仔细观察,您选择的字段显示为空,因为setOpaque(false)
会干扰default renderer API中提到的优化。您复制的DefaultTableCellRenderer
将无效。
作为参考,下面的示例会覆盖getColumnClass()
的{{1}},以获取DefaultTableModel
和Icon
类型的example。
Date