2013-01-16 115 views
1

我使用自定义模型和特性创建JTable。我有一个长期的书面课,能够正确地进行设置和渲染。我发现.getSelectedRows()方法不能正常工作,并且从来没有评估过某个值。我试图得到所选第一行的索引和最后一行。这是我的代码。JTable table.getSelectedRows()问题

public void actionPerformed(ActionEvent event) { 

    String command = event.getActionCommand(); 

    rows = table.getSelectedRows(); 

    firstRow = rows[0]; 

    int rowCount = rows.length; 

    lastRow = rows[(rowCount - 1)]; 

    if (command.equals("Run Threw")) { 

    }else if (command.equals("Shield Bash")) { 
     this.attack(firstRow, lastRow, command); 
    } 

     public boolean block (int defendersRow) { 
} 

public boolean fumble (int attackersRow) { 
} 

public boolean dodge (int defendersRow) { 
} 

public boolean critical (int attackersRow, int attackRoll) { 
} 


public void attack(int firstRow, int lastRow, String command) { 
    command = this.command; 
    firstRow = this.firstRow; 
    lastRow = this.lastRow; 

    if (command == "Bludgeon" || command == "React" || command == "ShieldBash") { 
     attackersRow = this.lastRow; 
     defendersRow = this.firstRow; 
    }else if(command == "Attack" || command == "Skill") { 
     attackersRow = this.firstRow; 
     defendersRow = this.lastRow; 
    }else { 

    } 
    table.setValueAt(true, attackersRow, 16); 
    fumbled = this.fumble(attackersRow); 
    if (fumbled == true) { 
     outputString = "fumbled"; 
    } 
    Object maxDamageObject = table.getValueAt(attackersRow, 10); 
    int maxDamage = (Integer) maxDamageObject; 
    attackRoll = generator.nextInt(100) + 1; 
    this.critical(attackersRow, attackRoll); 
    if (criticaled == true) { 
     outputString = "criticaled"; 
    } 
    dodged = this.dodge(defendersRow); 
    if (dodged == true) { 
     outputString = "dodged"; 
    } 
    blocked = this.block(defendersRow); 
    if (blocked == true) { 
     outputString = "blocked"; 
    } 
    int defenseRoll = generator.nextInt(100) + 1; 
    Object attackBaseObject = table.getValueAt(attackersRow, 6); 
    Object defenseBaseObject = table.getValueAt(defendersRow, 11); 
    int attackBase = (Integer) attackBaseObject; 
    int defenseBase = (Integer) defenseBaseObject; 
    int attack = attackRoll + attackBase; 
    int defense = defenseRoll + defenseBase; 
    Object minDamageObject = table.getValueAt(attackersRow, 9); 
    int minDamage = (Integer) minDamageObject; 
    damage = generator.nextInt((maxDamage - minDamage))+minDamage; 

    if (criticaled == true) { 
     damage = maxDamage * 2; 
    }else if (attack >= (defense + 50)) { 
     damage = damage * 2; 
    }else if (attack >= defense) { 
     damage = damage; 
    }else { 
     damage = 0; 
    } 

    this.outputSelection(outputString, attackersRow, defendersRow, command, damage); 
    this.damage(defendersRow, damage); 
} 

private void damage(int defendersRow, int damage) { 
} 

private void outputSelection(String outputString, int attackersRow, int defendersRow, String command, int damage) { 


} 
+2

哇,这是很多上下文...... JTable#getSelectedRows'可能会返回一个空数组,如果没有选择任何东西,您应该在尝试访问数组之前检查JTable#getSelectedRowCount或rows.length。 .. – MadProgrammer

+0

我同意你的观点,但是由于我正在进行测试,因此我知道我已经选择了行并且它仍然像没有其他任何东西一样出现? –

+0

编辑并在您的问题中添加可执行代码。 – vels4j

回答

2

我没有看到代码的问题。也许你可以交叉检查以下几点:

  1. 你能够选择单行/多行吗?或者查看jTableObject.getRowSelectionAllowed()返回的结果是
  2. 您的代码在选择行之后是否只调用。您的代码应该在选择某些行后执行,以便它可以返回您期望的值。
  3. 调用上述代码的侦听器是否添加到表中。

小点但更好的交叉检查:)。

2

如工作example所示,您可以将ListSelectionListener添加到您的表的ListSelectionModel并查看是否有任何内容通过。这可能有助于确定事情发生错误的地方:例如,本地table引用会影响预期的引用。