2011-04-14 28 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