这段程序是关于 JTable单元格自动换行的例子程序
如下:
import javax.swing.*; 
import javax.swing.table.*; 
import java.awt.*; class C extends JFrame { 
    public C() { 
        JTable tbl = new JTable(new String[][]{{ 
                "JTable 里单元格内容的显示器是 TableCellRenderer。", 
                "默认的显示器(DefaultTableCellRenderer)继承 JLabel 所以不方便多行显示。", 
                "要多行显示应该继承 JTextArea(参看下面的 TableCellTextAreaRenderer 类)。", 
                "当然,别忘了调用 JTable.setDefaultRenderer() 登记你的显示器。"}}, 
                "A B C D".split(" ")); 
        tbl.setDefaultRenderer(Object.class, new TableCellTextAreaRenderer());         add(new JScrollPane(tbl)); 
        setSize(800, 200); 
        setVisible(true); 
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
    }     public static void main(String[] args) { new C(); } 
} class TableCellTextAreaRenderer extends JTextArea implements TableCellRenderer { 
    public TableCellTextAreaRenderer() { 
        setLineWrap(true); 
        setWrapStyleWord(true); 
    }     public Component getTableCellRendererComponent(JTable table, Object value, 
            boolean isSelected, boolean hasFocus, int row, int column) { 
        // 计算当下行的最佳高度 
        int maxPreferredHeight = 0; 
        for (int i = 0; i < table.getColumnCount(); i++) { 
            setText("" + table.getValueAt(row, i)); 
            setSize(table.getColumnModel().getColumn(column).getWidth(), 0); 
            maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height); 
        }         if (table.getRowHeight(row) != maxPreferredHeight)  // 少了这行则处理器瞎忙 
            table.setRowHeight(row, maxPreferredHeight);         setText(value == null ? "" : value.toString()); 
        return this; 
    } 
} 现在遇到的问题是: 当我手动改变 Jtable 的列宽的时候,cpu利用率就达到100%,   怎样解决呢

解决方案 »

  1.   

                    for   (int   i   =   0;   i   <   table.getColumnCount();   i++)   {   
                            setText(""   +   table.getValueAt(row,   i));   
                            setSize(table.getColumnModel().getColumn(column).getWidth(),   0);   
                            maxPreferredHeight   =   Math.max(maxPreferredHeight,   getPreferredSize().height);   
                    } 这个for循环不需要.
      

  2.   


        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            //   \u8BA1算当下行的最佳高度
            int maxPreferredHeight = 0;
                setSize(table.getColumnModel().getColumn(column).getWidth(), 0);
                maxPreferredHeight = Math.max(maxPreferredHeight,
                                              getPreferredSize().height);
            if (table.getRowHeight(row) != maxPreferredHeight) { //   少了\u8FD9行\u5219\u5904理器瞎忙
                table.setRowHeight(row, maxPreferredHeight);
            }        setText(value == null ? "" : value.toString());
            return this;
        }
      

  3.   

    循环是为了 获取 各列 最大的行高
    maxPreferredHeight   =   Math.max(maxPreferredHeight,   getPreferredSize().height);   
    去掉不行吧大家有没有更好的关于自动换行的例子
      

  4.   

    public   Component   getTableCellRendererComponent()方法返回值的JDK说明是这样的:
    Returns the component used for drawing the cell.然而在方法执行后,却又返回this存在死循环的嫌疑如果你在类中增加一个static变量:
    private static int counter = 0;
    再在方法中添加个计数器:
    System.out.println(counter);
    counter++;程序运行时,变量值很快就会增加到几千,这是执行速度缓慢的原因。另外,使用HTML标签可以实现换行,但是自动化还是有点难度的,请参考官方资料:
    http://java.sun.com/docs/books/tutorial/uiswing/components/html.html