public Object getValueAt(int rowIndex, int columnIndex) {
   if (currentActor == null) return null;
   Attack attack = currentActor.getAttack(rowIndex);
   switch (columns.values()[columnIndex]) {
     case Name:
       return attack.name;
     case Skill:
       return attack.skill;
     case Damage:
       return attack.damage;
     case Unbalanced:
       return attack.unbalanced;
     default:
       return null;
   }
 }
  /**
   * Set the value at the row/col specified For cloned actors, this will update all clones (and fire
   * table updated events)
   *
   * @param value : Must be either int (for hp/damage/health) or String (for name/State/Type)
   * @param row : The row where the actor lives. Any clones will be updated also.
   * @param col : The column of the value to edit: use 'columns' enum to address.
   */
  @Override
  public void setValueAt(Object value, int row, int col) {
    if (LOG.isLoggable(Level.FINER)) {
      LOG.finer(
          "Setting value at "
              + row
              + ","
              + col
              + " to "
              + value
              + " (an instance of "
              + value.getClass()
              + ")");
    }

    // Check if there is any actual change
    if (getValueAt(row, col).equals(value)) {
      if (LOG.isLoggable(Level.FINER)) {
        LOG.finer("Values are identical. Exiting.");
      }
      return;
    }

    Attack a = currentActor.getAttack(row);
    switch (columns.values()[col]) {
      case Name:
        a.name = (String) value;
        break;
      case Skill:
        a.skill = (Integer) value;
        break;
      case Damage:
        a.damage = (String) value;
        break;
      case Unbalanced:
        a.unbalanced = (Boolean) value;
    }
    currentActor.setAttack(a, row);
    // Update the entire row, since changing state or type may affect formatting for all cells in
    // the row.
    fireTableRowsUpdated(row, row);
  }