【问题标题】:Jtable get selected row always returns -1Jtable 获取选定行总是返回 -1
【发布时间】:2021-10-27 05:50:03
【问题描述】:

我从昨天开始就有问题了。 我在 Eclipse 中使用 WindowBuilder 创建了一个 jTable,目前正在尝试使用 .getSelectedRow() 函数获取所选行的编号,但它始终返回 -1(未选择行),即使我有选择了一些东西。

这是我当前用于测试输出的代码:

public void checkActiveItem() {
        
        System.out.println(tableBills.getSelectedRow());
        
    }

我尝试让它通过计时器以这种方式运行,至少这似乎有效:

Timer time = new Timer();
        time.schedule(new TimerTask() {
            public void run() {
                Frontend f = new Frontend();
                f.checkActiveBill();
                f.checkActiveItem();
            }
        }, 250, 250 );

该表当前只有一个条目,但即使是第一行也不会在选择时返回。 我可以通过单击添加来创建新行(并通过在添加按钮旁边的文本字段中输入名称来命名它们)

要创建一个新行我使用这个代码,也许有问题?

public void addBill() {
        //maybe need this value somewhere else to, so let -1 and +1 as it is
        int numbersOfBills = tableBills.getRowCount() - 1;
        Bill newBill = new Bill(txtBillName.getText(), numbersOfBills + 1);
        
        DefaultTableModel billModel2 = (DefaultTableModel) tableBills.getModel();
        int billNb = numbersOfBills + 1;
        
        billModel2.addRow(new Object[] {newBill.getBillNr(),newBill.getBillName(), newBill.getItemsInBill()});
    }

【问题讨论】:

  • 在计时器的每次迭代中创建new Frontend()s,对我来说似乎是个问题。所以你总是在你新创建的前端调用checkActiveItem()。但是由于您没有发布minimal reproducible example,我无法进一步帮助您。
  • 函数 addBill() 在按钮按下时被调用。只有 checkActiveBill() 和 getSelectedRow() 函数将每 250 毫秒调用一次,所以我不会永久更改我的前端。
  • "我不会永久更改我的前端。" - 是的,你是。不是可见的,而是您正在调用方法的那个。查看计时器中的代码:Frontend f = new Frontend() checkActiveItem() 的对象。但是,这不是您看到并按下按钮的那个。所以这是一个完全不同的前端,它没有添加任何行。但同样,这是我所能做的,所以请提供minimal reproducible example
  • 你是对的,它们是前端的不同对象。我完全错过了。谢谢,我能够解决问题,您可以将其发布为答案。代码现在有效。

标签: java swing jtable


【解决方案1】:

即使您似乎“添加了一行”,您仍从getSelectedRow() 获得-1 的原因是,您调用checkActiveItem()Frontend 对象是一个完全不同的Frontend 对象比你看到的那个。

问题就在这里,在你的Timers run()

Frontend f = new Frontend();

您为每个计时器迭代创建一个新的Frontend 对象。你在这个对象上调用checkActiveItem(),而不是在你看到并按下按钮的前端。因此,输出不正确。

作为一种解决方案,不要创建新的Frontends,而是在您使其可见的原始前端对象上调用checkActiveItem()

【讨论】: