例子是从网上找的代码如下: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;    
    }    
} 运行后改变表格列的宽度就会导致程序严重占用CPU 求高手解答 这是为什么 应该怎么解决???跪求!

解决方案 »

  1.   

    帮你改了下
    你这样写 maxPreferredHeight 每次都被设成 0
    造成你每次算出来的的maxPreferredHeight 都要重绘
    然后界面就不断重绘,肯定耗cpuclass TableCellTextAreaRenderer extends JTextArea implements TableCellRenderer {    
        private int maxPreferredHeight = 0;

    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;    
        }    
      

  2.   

    又改了下,刚才那样会让行高不会变小
    这样CPU占用小了很多,拖动的时候cpu占用升高是正常的,因为Swing在重绘class TableCellTextAreaRenderer extends JTextArea implements TableCellRenderer {    
        private int maxPreferredHeight = 0;

    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);
            }    
            if (maxPreferredHeight != getPreferredSize().height) //行高需要变化时才改变maxPreferredHeight 
             maxPreferredHeight = getPreferredSize().height;
      
            if (table.getRowHeight(row) != maxPreferredHeight)   //行高需要变化时才重绘
                table.setRowHeight(row, maxPreferredHeight);    
      
            setText(value == null ? "" : value.toString());    
            return this;    
        }    
      

  3.   

    给你一个我现在用的呈现器:
    public class CallTaskCellRenderer extends DefaultListCellRenderer{    @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value instanceof Object) {
                Object obj= (Object) value;
                setText(obj.toString()        }        return this;
        }
    }
      

  4.   

    我改的第二个,还是会狂耗CPU
    TableCellRenderer
    是不断扫描的,
    在这里不断循环的改变组件的大小实在不大可取
    这个例子确实不好改
    用楼上那个试试吧……
      

  5.   

    3楼给的是 LIST的呈现器 小弟是新手 不知道怎么用到JTABLE上  麻烦给位解释一下 或者给一个能用的
    跪求!!
      

  6.   

    将List和JTable绑定,然后设置其呈现器就OK了。
    org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, list, jtableName);