【问题标题】:Provide additional behavior when editing a cell in JTable在 JTable 中编辑单元格时提供附加行为
【发布时间】:2010-12-17 08:05:54
【问题描述】:

我正在用 Java 创建一个应用程序。在编辑 JTable 中的单元格时,我需要提供其他行为。所以理想情况下,当单元格在编辑后失去焦点时会发生这种情况。根据一些后期处理,我可能会重置单元格的值。我尝试使用单元格编辑器,但它没有给我想要的行为。

只有当我双击一个单元格时,它才会在默认的 JTable 中变为可编辑的。但是在我的 CellEditor 实现中,单元格一旦成为焦点就变得可编辑。

这是我的自定义 CellEditor 的代码,

public class ParameterDefinitionEditor 
    extends AbstractCellEditor
    implements TableCellEditor{

    private JTable table;
    private DefaultTableModel defaultTableModel;

public ParameterDefinitionEditor(DefaultTableModel defaultTableModel,
JTable table) { 

        super();
        this.table = table;
        this.defaultTableModel = defaultTableModel;

        TableColumnModel columnModel = table.getColumnModel();
        columnModel.getColumn(0).setCellEditor(this);

}

    public Component getTableCellEditorComponent(JTable table, 
                            Object value, 
                         boolean isSelected, 
                        int row, 
                         int column) {

        if (isSelected) {
            // Do some processing.
        } 

        ((JTextField)component).setText((String)value);

        // Return the configured component
        return component;
    }

    public Object getCellEditorValue() {

        return ((JTextField)component).getText();
    }


}

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 郑重声明:这是 CellEditor 的无效实现 - 它必须在编辑因内部原因终止时通知其侦听器!

标签: java jtable tablecelleditor


【解决方案1】:

取决于一些后期处理我 可能会重置单元格的值。

如果您愿意,可以通过覆盖 stopCellEditing() 方法在单元格编辑器中直接执行此操作。

只有当我在默认的 JTable 双击它变成的单元格 可编辑。但是在我的实施中 CellEditor 单元格变为可编辑 只要它成为焦点。

扩展 DefaultCellEditor。这由 setClickCountToStart() 方法控制。

所以理想情况下,当 编辑后单元格失去焦点

我同意另一个建议,您可能应该将 TableModelListener 添加到 TableModel。尽管根据您的要求,您可能需要考虑使用Table Cell Listener

【讨论】:

  • 我实际上很喜欢您在链接中放置的 TableCellListener 示例。但是我的环境是 Java 1.5,所以实际上我不能使用该实用程序,因为“convertRowIndexToModel”在 1.5 中不可用。有解决办法吗?
  • 另外,当我们这样做的时候,有没有办法为某些列禁用此行为?
【解决方案2】:

我不认为提供自定义单元格编辑器可以达到您的目的。

如果您想根据用户操作进行一些处理,那么您的表模型应该具有
一组侦听器(实现 TableModelListener)和您的逻辑应该放在
在“tableChanged”方法中。

也可以查看 Swing 教程的这一部分:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

【讨论】:

    【解决方案3】:

    我通过覆盖 stopCellEditing 实现了这种行为(我使用 AbstractCellEditor 的自定义实现)

    public boolean stopCellEditing()
    {
    String s = (String) getCellEditorValue();
    if ( ! valueValidator.isValid(s) )
      {
      editorComponent.setBorder(new LineBorder(Color.red));        
      Toolkit.getDefaultToolkit().beep();
      return false;
      }
    }
    else { ........
    

    【讨论】:

      猜你喜欢
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多