【问题标题】:JTable table.getSelectedRows() issueJTable table.getSelectedRows() 问题
【发布时间】:2012-12-30 08:52:12
【问题描述】:

我创建了一个具有自定义模型和特征的JTable。我有一个很长的书面课程,可以正确执行设置和渲染。我看到 .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) {


}

【问题讨论】:

  • 哇,这里有很多上下文...JTable#getSelectedRows 可能会返回一个空数组,如果没有选择任何内容,您应该在尝试访问数组之前检查JTable#getSelectedRowCountrows.length。 .
  • 我同意你的观点,但由于我正在做测试,所以我知道我已经选择了行,但它仍然没有其他任何东西出现?
  • 在您的问题中编辑并添加可执行代码。
  • 你有错误的表参考...没有选择...海豚在水槽里玩耍...
  • @LukeGreenleaf 我看到一个错误,我不知道它与您的问题有关,但在您的attack 方法中使用String.equals() 方法进行字符串相等。此外,如果您可以在没有this 的情况下访问变量和方法,那么最好在没有this 的情况下使用它,而且fumbledcriticalboolean,那么您不需要使用== 来检查它们

标签: java swing jtable selection listselectionlistener


【解决方案1】:

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

  1. 您可以选择单行/多行吗?或者检查 jTableObject.getRowSelectionAllowed() 返回什么
  2. 您的代码是否仅在选择行之后才被调用。您的代码应在选择某些行后执行,以便它可以返回您的预期值。
  3. 调用上述代码的监听器,是否添加到表中。

小点但最好交叉检查:)。

【讨论】:

    【解决方案2】:

    如工作中的example 所示,您可以将ListSelectionListener 添加到表的ListSelectionModel 中,看看是否有任何结果。它可能有助于确定哪里出了问题:例如,一个本地的 table 引用会影响预期的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2011-01-23
      • 2012-03-16
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多