如何在JTable中实现多行文本渲染器 [英] How to implement multiple line text renderer in JTable

查看:218
本文介绍了如何在JTable中实现多行文本渲染器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了以下SO问题中提到的相同问题包装JTable中有多行.我发现已渲染多单元格做那个工作.现在我的问题是实现单元格渲染器后,我的单元格未显示包装的数据.我有自定义的tableModel,我不确定如何在该模型上调用datavalidator.任何人都可以建议我.

I faced the same problem as mentioned in the following SO question Wrap multiple lines in JTable. and I found Multile cell rendered to do that job. Now my problem is after implementing the cell renderer my cell is not showing wrapped data. I have custom tableModel and I am not sure how to call datavalidator on that model. Could anyone please suggest me.

我的表格模型:

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

}

并且我将单元格渲染器设置为

and I am setting my cell renderer as

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

程序仍未将数据换行.

推荐答案

如果没有完整的示例,我想您需要覆盖TableModel中的getColumnClass()以返回相同的

Absent a complete example, I'm guessing you need to override getColumnClass() in your TableModel to return the same type token that you specified in setDefaultRenderer(), i.e. String.class. Note that the AbstractTableModel implementation returns Object.class unconditionally.

这篇关于如何在JTable中实现多行文本渲染器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆