2013-05-16 39 views
2

我遇到了與以下SO問題Wrap multiple lines in JTable中提到的相同的問題。我找到Multile cell rendered來完成這項工作。現在我的問題是在實現單元格渲染器後,我的單元格不顯示包裝數據。我有自定義tableModel,我不知道如何在該模型上調用datavalidator。任何人都可以請建議我。如何在JTable中實現多行文本渲染器

我的表模型:

public class KeywordTableModel extends AbstractTableModel { 
    private static final long serialVersionUID = 1L; 
    Logger logger = Logger.getLogger(KeywordTableModel.class.getName()); 
    KeywordList keywordList ; 

public KeywordTableModel(KeywordList keywordList){ 
    this.keywordList = keywordList; 
} 

@Override 
public int getRowCount() { 
    // TODO Auto-generated method stub 
    return keywordList.getKeywords().size(); 
} 

@Override 
public int getColumnCount() { 
    // TODO Auto-generated method stub 
    return keywordList.getTitles().length; 
} 

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    // TODO Auto-generated method stub 
    TypeRec objectRec = (TypeRec) keywordList.getKeywords().elementAt(rowIndex); 
    return objectRec.getColumnData(columnIndex); 
} 

@Override 
public String getColumnName(int column){ 
    return keywordList.getTitles()[column]; 
} 

public void setDataValidator(){ 

} 

} 

我的單元格渲染器是:

/** 
    * Multiline Table Cell Renderer. 
    */ 
    public class MultiLineTableCellRenderer extends JTextArea 
    implements TableCellRenderer { 
    /** 
    * 
    */ 
Logger logger = Logger.getLogger(MultiLineTableCellRenderer.class.getName()); 
private static final long serialVersionUID = 1L; 
private List<List<Integer>> rowColHeight = new ArrayList<List<Integer>>(); 

public MultiLineTableCellRenderer() { 
    setLineWrap(true); 
    setWrapStyleWord(true); 
    setOpaque(true); 
    logger.debug("inside multilinetablecellrenderer constructor"); 
} 

public Component getTableCellRendererComponent(
    JTable table, Object value, boolean isSelected, boolean hasFocus, 
    int row, int column) { 
    logger.debug("inside multilinetablecellrenderer renderer"); 
    if (isSelected) { 
    setForeground(table.getSelectionForeground()); 
    setBackground(table.getSelectionBackground()); 
    } else { 
    setForeground(table.getForeground()); 
    setBackground(table.getBackground()); 
    } 
    setFont(table.getFont()); 
    if (hasFocus) { 
    setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); 
    if (table.isCellEditable(row, column)) { 
     setForeground(UIManager.getColor("Table.focusCellForeground")); 
     setBackground(UIManager.getColor("Table.focusCellBackground")); 
    } 
    } else { 
    setBorder(new EmptyBorder(1, 2, 1, 2)); 
    } 
    if (value != null) { 
    setText(value.toString()); 
    } else { 
    setText(""); 
    } 
    adjustRowHeight(table, row, column); 
    return this; 
} 

/** 
* Calculate the new preferred height for a given row, and sets the height on the table. 
*/ 
private void adjustRowHeight(JTable table, int row, int column) { 
    //The trick to get this to work properly is to set the width of the column to the 
    //textarea. The reason for this is that getPreferredSize(), without a width tries 
    //to place all the text in one line. By setting the size with the with of the column, 
    //getPreferredSize() returnes the proper height which the row should have in 
    //order to make room for the text. 
    logger.debug("inside adjustRowheight method for adjusting the row height"); 
    int cWidth = table.getTableHeader().getColumnModel().getColumn(column).getWidth(); 
    setSize(new Dimension(cWidth, 1000)); 
    int prefH = getPreferredSize().height; 
    while (rowColHeight.size() <= row) { 
    rowColHeight.add(new ArrayList<Integer>(column)); 
    } 
    List<Integer> colHeights = rowColHeight.get(row); 
    while (colHeights.size() <= column) { 
    colHeights.add(0); 
    } 
    colHeights.set(column, prefH); 
    int maxH = prefH; 
    for (Integer colHeight : colHeights) { 
    if (colHeight > maxH) { 
     maxH = colHeight; 
    } 
    } 
    if (table.getRowHeight(row) != maxH) { 
    table.setRowHeight(row, maxH); 
    } 
} 

}

,我設置我的格渲染爲

 cnr_DATA.setDefaultRenderer(String.class, new MultiLineTableCellRenderer()); 

的程序是仍然沒有包裝d ata多行。

回答

3

缺席一個完整的例子,我猜你需要重寫getColumnClass()TableModel返回您在setDefaultRenderer()指定的相同type token,即String.class。請注意,AbstractTableModel實施無條件地返回Object.class

+1

@Ashish [see doLayout()](http://stackoverflow.com/a/12867849/714968) – mKorbel

+0

@trashgod非常感謝你,你的建議完美地工作。再次感謝 – Ashish

+0

@trashgod還有一個問題,所以如果我們想根據內容設置列的寬度,我們如何實現這一點。 – Ashish