/*
 * @(#)DefaultCellEditor.java 1.53 08/02/04
 *
 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */package com.eamois.ui.util;import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.io.Serializable;
import java.util.EventObject;import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.TableCellEditor;
import javax.swing.tree.TreeCellEditor;public class PRSCellEditor extends AbstractCellEditor implements
TableCellEditor, TreeCellEditor { protected JTextArea editorComponent; protected EditorDelegate delegate; protected int clickCountToStart = 1; public PRSCellEditor(final JTextArea textArea) {
textArea.setLineWrap(true);
editorComponent = textArea;
this.clickCountToStart = 2;
delegate = new EditorDelegate() {
public void setValue(Object value) {
textArea.setText((value != null) ? value.toString() : "");
} public Object getCellEditorValue() {
return textArea.getText();
}
};

}
public Component getComponent() {
return editorComponent;
} public void setClickCountToStart(int count) {
clickCountToStart = count;
} public int getClickCountToStart() {
return clickCountToStart;
} public Object getCellEditorValue() {
return delegate.getCellEditorValue();
} public boolean isCellEditable(EventObject anEvent) {
return delegate.isCellEditable(anEvent);
} public boolean shouldSelectCell(EventObject anEvent) {
return delegate.shouldSelectCell(anEvent);
} public boolean stopCellEditing() {
return delegate.stopCellEditing();
} public void cancelCellEditing() {
delegate.cancelCellEditing();
} public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row) {
String stringValue = tree.convertValueToText(value, isSelected,
expanded, leaf, row, false); delegate.setValue(stringValue); return editorComponent;
} public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
delegate.setValue(value);
// if (editorComponent instanceof JCheckBox) {
//
// TableCellRenderer renderer = table.getCellRenderer(row, column);
// Component c = renderer.getTableCellRendererComponent(table, value,
// isSelected, true, row, column);
// if (c != null) {
// editorComponent.setOpaque(true);
// editorComponent.setBackground(c.getBackground());
// if (c instanceof JComponent) {
// editorComponent.setBorder(((JComponent) c).getBorder());
// }
// } else {
// editorComponent.setOpaque(false);
// }
// }
// 计算当下行的最佳高度
int maxPreferredHeight = 0;
for (int i = 0; i < table.getColumnCount(); i++) {
editorComponent.setText("" + table.getValueAt(row, i));
editorComponent.setSize(table.getColumnModel().getColumn(column)
.getWidth(), 0);
maxPreferredHeight = Math.max(maxPreferredHeight,
editorComponent.getPreferredSize().height);
}
if (table.getRowHeight(row) != maxPreferredHeight) // 少了这行则处理器瞎忙
table.setRowHeight(row, maxPreferredHeight);
editorComponent.setText(value == null ? "" : value.toString());
return editorComponent;
} protected class EditorDelegate implements ActionListener, ItemListener,
Serializable{ protected Object value; public Object getCellEditorValue() {
return value;
} public void setValue(Object value) {
this.value = value;
} public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
return ((MouseEvent) anEvent).getClickCount() >= clickCountToStart;
}
return true;
} public boolean shouldSelectCell(EventObject anEvent) {
return true;
} public boolean startCellEditing(EventObject anEvent) {
return true;
} public boolean stopCellEditing() {
fireEditingStopped();
return true;
} public void cancelCellEditing() {
fireEditingCanceled();
} public void actionPerformed(ActionEvent e) {
PRSCellEditor.this.stopCellEditing();
} public void itemStateChanged(ItemEvent e) {
PRSCellEditor.this.stopCellEditing();
} }}

解决方案 »

  1.   

    重写以下其中的方法试试
    下面这个方法也是我搜来的,没试过,你试试。主要实现单元格渲染接口,该类扩展自JTextArea,因为其有自动换行的功能。 public class MultiLineTableCellRender  extends JTextArea implements TableCellRenderer 
    { public JTable extTable = null; 
    public MultiLineTableCellRender() 

      setLineWrap(true); 
      setWrapStyleWord(true);//JTextArea自动换行的功能 
      this.setBorder(BorderFactory.createEmptyBorder(1, 1, 0, 0));    //去掉jtextarea的默认边框,因为和JTable的表格线有重叠 } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 

      // 计算当下行的最佳高度   //计算了该行所有列的内容所对应的高度,挑选最高的那个 
      int maxPreferredHeight = 18; 
      for(int i = 0; i < table.getColumnCount(); i++) 
      { 
       setText("" + table.getValueAt(row, i)); 
       setSize(table.getColumnModel().getColumn(column).getWidth(), 0); 
       maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height); 
      }   if(table.getRowHeight(row) != maxPreferredHeight)   { 
       table.setRowHeight(row, maxPreferredHeight); 
      } 
      
      
      if(isSelected) 
      { 
       this.setBackground(table.getSelectionBackground()); 
      } 
      else 
      { 
       this.setBackground(table.getBackground());     
      }   setText(value == null ? "" : value.toString()); 
      return this; 
    } }
      

  2.   

    你要动态改变正在输出的JTextArea的行高?估计这个没办法实现,因为你没事件触发JTextArea去重新加载改变他的行高