2011-04-14 37 views
1

我在实现定制细胞渲染器时遇到问题,它会在消息内容延伸超过一行时包装消息内容。以下是我有:线环绕细胞渲染器 - Java

public class MessageTable extends JTable 
{ 

    private static MessageTable messageTable; 
    private DefaultTableModel model = new DefaultTableModel(); 
    private String[] emptyData = {}; 
    private TreeMap<Integer, String> messages = null; 

    public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer { 

     @Override 
     public Component getTableCellRendererComponent(
         JTable table, 
         Object value, 
         boolean isSelected, 
         boolean hasFocus, 
         int row, 
         int column) { 
       this.setText((String)value); 
       this.setWrapStyleWord(true);      
       this.setLineWrap(true);  

       this.setBackground(Color.YELLOW); 

       int fontHeight = this.getFontMetrics(this.getFont()).getHeight(); 
       int textLength = this.getText().length(); 
       int lines = textLength/this.getColumns() +1;//+1, because we need at least 1 row.      
       int height = fontHeight * lines;       
       table.setRowHeight(row, height); 
       return this; 
     } 
    } 

    public MessageTable() 
    { 
     super(); 
     messageTable = this; 
     this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);  

     model.addColumn("Message Number", emptyData); 
     model.addColumn("Message Content", emptyData); 

     this.setModel(model); 
     this.setFont(MappingView.theFont); 

     this.setDefaultRenderer(String.class, new LineWrapCellRenderer()); 
    } 

    /** 
    * Set the current messages. 
    * @param messages 
    */ 
    public void setCurrentMessages(TreeMap<Integer, String> messages) 
    { 
     clearCurrentMessages(); 

     this.messages = messages; 

     if (messages != null) 
     { 
      for (Integer key : messages.keySet()) 
      { 
       String[] row = { key.toString(), messages.get(key).toString() }; 
       model.addRow(row); 
      } 
     } 
    } 

出于某种原因,LineWrapCellRenderer是从未使用过,行永远只包含一个文本行。

我在做什么错?

+1

要小心:在getXXRendererComponent(..)中传递的所有参数都是严格深度只读!换句话说:从来没有改变任何,如果它的属性 – kleopatra 2011-04-30 13:58:35

回答

1

不使用你的CellRenderer因为默认的表模型对于任何列返回Object.class(它不会覆盖AbstractTableModel上的实现):

public Class<?> getColumnClass(int columnIndex) { 
    return Object.class; 
} 

因此,要么自己覆盖的方法为模型或指定的渲染器到Object.class

+1

我相信你的意思是改变this.setDefaultRenderer(String.class,new LineWrapCellRenderer()); to this.setDefaultRenderer(Object.class,new LineWrapCellRenderer()),但是当我尝试这个时,我得到一个除0错误的线上:int lines = textLength/this.getColumns()+1;为什么会这样? – user632906 2011-04-14 18:49:03

+1

您从不设置列数(JTextArea.setColumns(...))。因此它总是返回零,并产生零除。 – Howard 2011-04-14 19:05:40