/*
* @(#)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();
} }}
* @(#)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();
} }}
下面这个方法也是我搜来的,没试过,你试试。主要实现单元格渲染接口,该类扩展自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;
} }