JTable行选择背景问题。

时间:2011-07-29 13:12:57

标签: java swing jtable renderer defaulttablemodel

我有一个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);

每件事都正常运作。但是当我选择一行时,行数据会隐藏。它会显示我的行this

我希望结果与此相同,enter image description here dtModel 是我的 JTable deafultTableModel ,名为 tblMainView

1 个答案:

答案 0 :(得分:6)

覆盖prepareRenderer()是一种recommended方法,可以为整个表格行进行自定义渲染,但是无法让它完成所有操作。特别是,Icon的{​​{3}}应该按照您的意愿行事,而且根本没有理由覆盖paint()

附录:仔细观察,您选择的字段显示为空,因为setOpaque(false)会干扰default renderer API中提到的优化。您复制的DefaultTableCellRenderer将无效。

作为参考,下面的示例会覆盖getColumnClass()的{​​{1}},以获取DefaultTableModelIcon类型的example

Java GUI

Date