Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JTable中实现多行文本渲染器_Java_Swing_Jtable_Abstracttablemodel - Fatal编程技术网

Java 如何在JTable中实现多行文本渲染器

Java 如何在JTable中实现多行文本渲染器,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,我面临的问题与下面的问题相同。我找到了做这项工作的方法。现在我的问题是在实现单元渲染器之后,我的单元没有显示包装的数据。我有定制的tableModel,我不知道如何在该模型上调用datavalidator。谁能给我推荐一下吗 我的桌子型号: public class KeywordTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; Logger logge

我面临的问题与下面的问题相同。我找到了做这项工作的方法。现在我的问题是在实现单元渲染器之后,我的单元没有显示包装的数据。我有定制的tableModel,我不知道如何在该模型上调用datavalidator。谁能给我推荐一下吗

我的桌子型号:

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

程序仍然没有将数据包装成多行。

缺少完整的示例,我猜您需要覆盖
表格模型中的
getColumnClass()
,以返回与
setDefaultRenderer()
中指定的相同的值,即
String.class
。请注意,
AbstractTableModel
实现无条件返回
Object.class

@trashgood非常感谢您,您的建议非常有效。谢谢again@trashgod还有一个问题,如果我们想根据列的内容设置列的宽度,我们如何实现这一点。请参阅。
     cnr_DATA.setDefaultRenderer(String.class, new MultiLineTableCellRenderer());