Java (少女){ //延迟创建事件: 如果(changeEvent==null)changeEvent=newchangeevent(this); ((CellEditorListener)监听器[i+1])。编辑停止(changeEvent); } } } 受保护的无效FireEditingCancelled(){ //保证返回非空数组 Object[]listeners=listenerList.getListenerList(); //从最后一个到第一个处理侦听器,通知 //那些对这次活动感兴趣的人 for(int i=listeners.length-2;i>=0;i-=2){ if(侦听器[i]==CellEditorListener.class){ //延迟创建事件: 如果(changeEvent==null)changeEvent=newchangeevent(this); ((CellEditorListener)侦听器[i+1])。编辑已取消(changeEvent); } } } }

Java (少女){ //延迟创建事件: 如果(changeEvent==null)changeEvent=newchangeevent(this); ((CellEditorListener)监听器[i+1])。编辑停止(changeEvent); } } } 受保护的无效FireEditingCancelled(){ //保证返回非空数组 Object[]listeners=listenerList.getListenerList(); //从最后一个到第一个处理侦听器,通知 //那些对这次活动感兴趣的人 for(int i=listeners.length-2;i>=0;i-=2){ if(侦听器[i]==CellEditorListener.class){ //延迟创建事件: 如果(changeEvent==null)changeEvent=newchangeevent(this); ((CellEditorListener)侦听器[i+1])。编辑已取消(changeEvent); } } } },java,swing,jtable,jscrollpane,jtextarea,Java,Swing,Jtable,Jscrollpane,Jtextarea,编辑:将继承替换为委派以下是我的测试代码: import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; public class MultiLineCellEditorTest { public JComponent makeUI() { String[] co

编辑:将继承替换为委派

以下是我的测试代码:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class MultiLineCellEditorTest {
  public JComponent makeUI() {
    String[] columnNames = {"JTextField", "JTextArea"};
    Object[][] data = {
      {"aaa", "JTextArea+JScrollPane\nCtrl-Enter: stopCellEditing"},
      {"bbb", "ggg"}, {"ccccDDD", "hhh\njjj\nkkk"}
    };
    TableModel model = new DefaultTableModel(data, columnNames) {
      @Override public Class<?> getColumnClass(int column) {
        return String.class;
      }
    };
    JTable table = new JTable(model) {
      @Override public void updateUI() {
        super.updateUI();
        TableColumn col = getColumnModel().getColumn(1);
        col.setCellEditor(new TextAreaCellEditor());
        col.setCellRenderer(new TextAreaCellRenderer());
      }
    };
    table.setAutoCreateRowSorter(true);
    table.setSurrendersFocusOnKeystroke(true);
    table.setRowHeight(64);
    return new JScrollPane(table);
  }
  public static void main(String... args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new MultiLineCellEditorTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
class TextAreaCellRenderer implements TableCellRenderer {
  private final JTextArea textArea = new JTextArea();
  public TextAreaCellRenderer() {
    textArea.setLineWrap(true);
    textArea.setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 5));
  }
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    if (isSelected) {
      textArea.setForeground(table.getSelectionForeground());
      textArea.setBackground(table.getSelectionBackground());
    } else {
      textArea.setForeground(table.getForeground());
      textArea.setBackground(table.getBackground());
    }
    textArea.setFont(table.getFont());
    textArea.setText(Objects.toString(value, ""));
    return textArea;
  }
}
//class TextAreaCellEditor extends AbstractCellEditor implements TableCellEditor {
class TextAreaCellEditor implements TableCellEditor {
  private static final String KEY = "Stop-Cell-Editing";
  private final JScrollPane scroll;
  private final JTextArea textArea = new JTextArea();
  public TextAreaCellEditor() {
    //super();
    scroll = new JScrollPane(textArea);
    scroll.setBorder(BorderFactory.createEmptyBorder());
    textArea.setLineWrap(true);
    textArea.setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 5));
    KeyStroke enter = KeyStroke.getKeyStroke(
        KeyEvent.VK_ENTER, InputEvent.CTRL_MASK);
    textArea.getInputMap(JComponent.WHEN_FOCUSED).put(enter, KEY);
    textArea.getActionMap().put(KEY, new AbstractAction() {
      @Override public void actionPerformed(ActionEvent e) {
        stopCellEditing();
      }
    });
  }
  @Override public Object getCellEditorValue() {
    return textArea.getText();
  }
  @Override public Component getTableCellEditorComponent(
      JTable table, Object value, boolean isSelected, int row, int column) {
    System.out.println("2. getTableCellEditorComponent");
    textArea.setFont(table.getFont());
    textArea.setText(Objects.toString(value, ""));
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        textArea.setCaretPosition(textArea.getText().length());
        textArea.requestFocusInWindow();
        System.out.println("4. invokeLater: getTableCellEditorComponent");
      }
    });
    return scroll;
  }
  @Override public boolean isCellEditable(final EventObject e) {
    if (e instanceof MouseEvent) {
      return ((MouseEvent) e).getClickCount() >= 2;
    }
    System.out.println("1. isCellEditable");
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        if (e instanceof KeyEvent) {
          KeyEvent ke = (KeyEvent) e;
          char kc = ke.getKeyChar();
          if (Character.isUnicodeIdentifierStart(kc)) {
            textArea.setText(textArea.getText() + kc);
            System.out.println("3. invokeLater: isCellEditable");
          }
        }
      }
    });
    return true;
  }

  //Copid from AbstractCellEditor
  protected EventListenerList listenerList = new EventListenerList();
  transient protected ChangeEvent changeEvent = null;
  @Override public boolean shouldSelectCell(EventObject e) {
    return true;
  }
  @Override public boolean stopCellEditing() {
    fireEditingStopped();
    return true;
  }
  @Override public void cancelCellEditing() {
    fireEditingCanceled();
  }
  @Override public void addCellEditorListener(CellEditorListener l) {
    listenerList.add(CellEditorListener.class, l);
  }
  @Override public void removeCellEditorListener(CellEditorListener l) {
    listenerList.remove(CellEditorListener.class, l);
  }
  public CellEditorListener[] getCellEditorListeners() {
    return listenerList.getListeners(CellEditorListener.class);
  }
  protected void fireEditingStopped() {
    // Guaranteed to return a non-null array
    Object[] listeners = listenerList.getListenerList();
    // Process the listeners last to first, notifying
    // those that are interested in this event
    for(int i = listeners.length-2; i>=0; i-=2) {
      if(listeners[i]==CellEditorListener.class) {
        // Lazily create the event:
        if(changeEvent == null) changeEvent = new ChangeEvent(this);
        ((CellEditorListener)listeners[i+1]).editingStopped(changeEvent);
      }
    }
  }
  protected void fireEditingCanceled() {
    // Guaranteed to return a non-null array
    Object[] listeners = listenerList.getListenerList();
    // Process the listeners last to first, notifying
    // those that are interested in this event
    for(int i = listeners.length-2; i>=0; i-=2) {
      if(listeners[i]==CellEditorListener.class) {
        // Lazily create the event:
        if(changeEvent == null) changeEvent = new ChangeEvent(this);
        ((CellEditorListener)listeners[i+1]).editingCanceled(changeEvent);
      }
    }
  }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.event.*;
导入javax.swing.table.*;
公共类multilecelleditortest{
公共JComponent makeUI(){
String[]columnNames={“JTextField”,“JTextArea”};
对象[][]数据={
{“aaa”,“JTextArea+JScrollPane\nCtrl Enter:stopCellEditing”},
{“bbb”,“ggg”},{“ccccDDD”,“hhh\njjj\nkkk”}
};
TableModel model=新的DefaultTableModel(数据、列名){
@重写公共类getColumnClass(int列){
返回字符串.class;
}
};
JTable表格=新JTable(型号){
@重写公共void updateUI(){
super.updateUI();
TableColumn col=getColumnModel().getColumn(1);
col.setCellEditor(新的TextAreaCellEditor());
col.setCellRenderer(新的TextAreaCellRenderer());
}
};
表.setAutoCreateRowSorter(真);
表.setUrrendersFocusonKeystroke(真);
表1.设置行高(64);
返回新的JScrollPane(表);
}
公共静态void main(字符串…参数){
invokeLater(新的Runnable(){
@重写公共无效运行(){
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI(){
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新的multileCelleditorTest().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
类TextAreaCellRenderer实现TableCellRenderer{
私有最终JTextArea textArea=新JTextArea();
公共文本区域单元格渲染器(){
textArea.setLineWrap(true);
textArea.setBorder(BorderFactory.createEmptyByOrder(1,5,1,5));
}
@重写公共组件GetTableCellRenderComponent(
JTable表,对象值,布尔值,
布尔值(焦点、整数行、整数列){
如果(当选){
textArea.setForeground(table.getSelectionForeground());
textArea.setBackground(table.getSelectionBackground());
}否则{
textArea.setForeground(table.getForeground());
textArea.setBackground(table.getBackground());
}
setFont(table.getFont());
textArea.setText(Objects.toString(值“”);
返回文本区;
}
}
//类TextAreaCellEditor扩展AbstractCellEditor实现TableCellEditor{
类TextAreaCellEditor实现TableCellEditor{
私有静态最终字符串KEY=“停止单元格编辑”;
私人最终JScrollPane滚动条;
私有最终JTextArea textArea=新JTextArea();
公共文本区域CellEditor(){
//超级();
滚动=新的JScrollPane(textArea);
scroll.setboorder(BorderFactory.createEmptyByOrder());
textArea.setLineWrap(true);
textArea.setBorder(BorderFactory.createEmptyByOrder(1,5,1,5));
击键输入=击键。getKeyStroke(
KeyEvent.VK\u输入,InputEvent.CTRL\u掩码);
getInputMap(JComponent.WHEN_FOCUSED).put(回车,键);
textArea.getActionMap().put(键,new AbstractAction()){
@覆盖已执行的公共无效操作(ActionEvent e){
stopCellEditing();
}
});
}
@重写公共对象getCellEditorValue(){
返回textArea.getText();
}
@重写公共组件getTableCellEditorComponent(
JTable表,对象值,布尔值(选定,int行,int列){
System.out.println(“2.GetTableCellEditor组件”);
setFont(table.getFont());
textArea.setText(Objects.toString(值“”);
invokeLater(新的Runnable(){
@重写公共无效运行(){
setCaretPosition(textArea.getText().length());
textArea.requestFocusInWindow();
System.out.println(“4.invokeLater:getTableCellEditorComponent”);
}
});
返回滚动条;
}
@重写公共布尔值isCellEditable(最终事件对象e){
if(例如MouseEvent的实例){
return((MouseEvent)e).getClickCount()>=2;
}
System.out.println(“1.isCellEditable”);
invokeLater(新的Runnable(){
@重写公共无效运行(){
if(e instanceof KeyEvent){
KeyEvent ke=(KeyEvent)e;
char kc=ke.getKeyChar();
if(字符.isUnicodeIdentifierStart(kc)){
textArea.setText(textArea.getText()+kc);
System.out.println(“3.invokeLater:isCellEditable”);
}
}
}
});
返回true;
}
//从AbstractCellEditor复制
受保护的EventListenerList=新的EventListenerList();
瞬态保护的ChangeEvent ChangeEvent=null;
@重写公共布尔值shouldSelectCell(EventObject e){
返回true;
}
@重写公共布尔stopCellEditing(){
fireEditingStopped();
返回true;
}
@覆盖公共void cancellediting(){
FireEditingCancelled();
}
@重写公共无效addCellEditorListener(CellEditorListener l){
add(CellEditorListener.class,l);
}
@重写公共无效removeCellEditorListener(CellEditorListener l){
删除(CellEditorListener.class,l);
}
public CellEditorListener[]getCellEd
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class MultiLineCellEditorTest {
  public JComponent makeUI() {
    String[] columnNames = {"JTextField", "JTextArea"};
    Object[][] data = {
      {"aaa", "JTextArea+JScrollPane\nCtrl-Enter: stopCellEditing"},
      {"bbb", "ggg"}, {"ccccDDD", "hhh\njjj\nkkk"}
    };
    TableModel model = new DefaultTableModel(data, columnNames) {
      @Override public Class<?> getColumnClass(int column) {
        return String.class;
      }
    };
    JTable table = new JTable(model) {
      @Override public void updateUI() {
        super.updateUI();
        TableColumn col = getColumnModel().getColumn(1);
        col.setCellEditor(new TextAreaCellEditor());
        col.setCellRenderer(new TextAreaCellRenderer());
      }
    };
    table.setAutoCreateRowSorter(true);
    table.setSurrendersFocusOnKeystroke(true);
    table.setRowHeight(64);
    return new JScrollPane(table);
  }
  public static void main(String... args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new MultiLineCellEditorTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
class TextAreaCellRenderer implements TableCellRenderer {
  private final JTextArea textArea = new JTextArea();
  public TextAreaCellRenderer() {
    textArea.setLineWrap(true);
    textArea.setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 5));
  }
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    if (isSelected) {
      textArea.setForeground(table.getSelectionForeground());
      textArea.setBackground(table.getSelectionBackground());
    } else {
      textArea.setForeground(table.getForeground());
      textArea.setBackground(table.getBackground());
    }
    textArea.setFont(table.getFont());
    textArea.setText(Objects.toString(value, ""));
    return textArea;
  }
}
//class TextAreaCellEditor extends AbstractCellEditor implements TableCellEditor {
class TextAreaCellEditor implements TableCellEditor {
  private static final String KEY = "Stop-Cell-Editing";
  private final JScrollPane scroll;
  private final JTextArea textArea = new JTextArea();
  public TextAreaCellEditor() {
    //super();
    scroll = new JScrollPane(textArea);
    scroll.setBorder(BorderFactory.createEmptyBorder());
    textArea.setLineWrap(true);
    textArea.setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 5));
    KeyStroke enter = KeyStroke.getKeyStroke(
        KeyEvent.VK_ENTER, InputEvent.CTRL_MASK);
    textArea.getInputMap(JComponent.WHEN_FOCUSED).put(enter, KEY);
    textArea.getActionMap().put(KEY, new AbstractAction() {
      @Override public void actionPerformed(ActionEvent e) {
        stopCellEditing();
      }
    });
  }
  @Override public Object getCellEditorValue() {
    return textArea.getText();
  }
  @Override public Component getTableCellEditorComponent(
      JTable table, Object value, boolean isSelected, int row, int column) {
    System.out.println("2. getTableCellEditorComponent");
    textArea.setFont(table.getFont());
    textArea.setText(Objects.toString(value, ""));
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        textArea.setCaretPosition(textArea.getText().length());
        textArea.requestFocusInWindow();
        System.out.println("4. invokeLater: getTableCellEditorComponent");
      }
    });
    return scroll;
  }
  @Override public boolean isCellEditable(final EventObject e) {
    if (e instanceof MouseEvent) {
      return ((MouseEvent) e).getClickCount() >= 2;
    }
    System.out.println("1. isCellEditable");
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        if (e instanceof KeyEvent) {
          KeyEvent ke = (KeyEvent) e;
          char kc = ke.getKeyChar();
          if (Character.isUnicodeIdentifierStart(kc)) {
            textArea.setText(textArea.getText() + kc);
            System.out.println("3. invokeLater: isCellEditable");
          }
        }
      }
    });
    return true;
  }

  //Copid from AbstractCellEditor
  protected EventListenerList listenerList = new EventListenerList();
  transient protected ChangeEvent changeEvent = null;
  @Override public boolean shouldSelectCell(EventObject e) {
    return true;
  }
  @Override public boolean stopCellEditing() {
    fireEditingStopped();
    return true;
  }
  @Override public void cancelCellEditing() {
    fireEditingCanceled();
  }
  @Override public void addCellEditorListener(CellEditorListener l) {
    listenerList.add(CellEditorListener.class, l);
  }
  @Override public void removeCellEditorListener(CellEditorListener l) {
    listenerList.remove(CellEditorListener.class, l);
  }
  public CellEditorListener[] getCellEditorListeners() {
    return listenerList.getListeners(CellEditorListener.class);
  }
  protected void fireEditingStopped() {
    // Guaranteed to return a non-null array
    Object[] listeners = listenerList.getListenerList();
    // Process the listeners last to first, notifying
    // those that are interested in this event
    for(int i = listeners.length-2; i>=0; i-=2) {
      if(listeners[i]==CellEditorListener.class) {
        // Lazily create the event:
        if(changeEvent == null) changeEvent = new ChangeEvent(this);
        ((CellEditorListener)listeners[i+1]).editingStopped(changeEvent);
      }
    }
  }
  protected void fireEditingCanceled() {
    // Guaranteed to return a non-null array
    Object[] listeners = listenerList.getListenerList();
    // Process the listeners last to first, notifying
    // those that are interested in this event
    for(int i = listeners.length-2; i>=0; i-=2) {
      if(listeners[i]==CellEditorListener.class) {
        // Lazily create the event:
        if(changeEvent == null) changeEvent = new ChangeEvent(this);
        ((CellEditorListener)listeners[i+1]).editingCanceled(changeEvent);
      }
    }
  }
}