读书人

小弟我把Jtable的setDefaultEditorx实

发布时间: 2013-01-21 10:15:39 作者: rapoo

我把Jtable的setDefaultEditorx实现了自己的CellEditor,弄成了单元格是JtextArea,编辑状态不知道怎么自动增加行高

/*
* @(#)DefaultCellEditor.java1.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;
}


[解决办法]
你要动态改变正在输出的JTextArea的行高?估计这个没办法实现,因为你没事件触发JTextArea去重新加载改变他的行高
[解决办法]
小弟我把Jtable的setDefaultEditorx实现了自己的CellEditor,弄成了单元格是JtextArea,编辑状态不知道如何自动增加行高帮顶

读书人网 >J2SE开发

热点推荐