首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

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

2013-01-21 
我把Jtable的setDefaultEditorx实现了自己的CellEditor,弄成了单元格是JtextArea,编辑状态不知道怎么自动

我把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,编辑状态不知道如何自动增加行高帮顶

热点排行