JTable Calls Custom Cell Renderer Method… Continuously

前端 未结 3 557
一整个雨季
一整个雨季 2020-11-28 15:19

Compilable source can be found at: http://www.splashcd.com/jtable.tar

I\'m new to the language, so I\'m not sure if this is acceptable behavior or not.

I cre

3条回答
  •  难免孤独
    2020-11-28 15:52

    The problem seems to stem from having JTable's setRowHeight() inside the custom cell renderer, as it calls the custom cell renderer, throwing it into an infinite loop.

    I had to add in a check to see if the current row height matched the calculated word wrapped row height. If it did, I didnt try to setRowHeight() again.

    Corrected Code:

    import java.awt.Component;
    
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    import javax.swing.UIManager;
    import javax.swing.table.TableCellRenderer;
    
    //custom cell renderer for word wrapping, but if you use, you have to
    //implement zebra striping functionality which the default renderer has
    public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer
    {
        private int numOfTimesCalled;
        @Override
        public Component getTableCellRendererComponent(
                JTable table,
                Object value,
                boolean isSelected,
                boolean hasFocus,
                int row,
                int column)
        {
            System.out.println("Line Wrap Cell Renderer Called: " + numOfTimesCalled++);
            System.out.println("row:"+ row + ", col:" + column);
    //set up the row size based on the number of newlines in the text in the cell
            int fontHeight = this.getFontMetrics(this.getFont()).getHeight();
            int numWraps = value.toString().split("\r\n|\r|\n").length;
            int rowHeight = fontHeight * numWraps;
    //if the calculated rowHeight is the same as the row height of row,
    // then don't call setRowHeight again, as doing so will throw us into
    // an infinite loop
            if(rowHeight != table.getRowHeight(row))
            {
                table.setRowHeight(row, rowHeight);
    
    //configure word wrapping
                setWrapStyleWord(true);
                setLineWrap(true);
    //use the table's font
                setFont(table.getFont());
            }
    //zebra striping, because whatever cell uses this renderer loses the
    //default cell renderer zebra striping
            if(isSelected)
            {
                setBackground(table.getSelectionBackground());
            }
            else
            {
                if(row%2 == 1)
                {
                    setBackground(UIManager.getColor("Table.alternateRowColor"));
                }
                else
                {
                    setBackground(table.getBackground());
                }
            }
            this.setText(value.toString());
            return this;
        }
    }
    

提交回复
热议问题