首页 > 解决方案 > 为什么同一类中的 getSelectedRow() 给出了正确的值,但在不同的类中它给出了 -1,即使选择了一行?

问题描述

为什么当我getSelectedRow()在同一个类中调用时它返回正确的值,但是当我尝试从另一个类调用该方法时,即使选择了一行,它也会返回-1?

例如,我有这样的方法。

    public int getSelectedRow(){
        int row = drinksTable.getSelectedRow();
        System.out.println(row);
        return row;
    }

我有一个 jframe 类A和一个B类,其中包含购买、删除、编辑等所有功能。我需要知道选择了哪一行才能购买、删除、编辑正确的记录。上面的代码在A类中。问题是,如果我尝试在B类中调用上述方法,则返回的行始终为 -1,这意味着没有选择任何行,即使它清楚地显示在表中突出显示并选择了一行。如果我尝试在同一个类中调用该方法,它会返回正确的值。这里有什么问题?

例如,这里的A类称为 VendingMachine。我在B类中有这样的方法。我使用该方法的部分位于声明发生的上半部分。由于我希望根据所选行更改值,因此selectedRow内部getValueAt(selectedRow, 1)是这样的。

   public static void purchaseDrink(String editTerm, String oldAmount, String newAmount, String filepath){
        VendingMachine vm = new VendingMachine();
        int selectedRow = vm.getSelectedRow();
        String tempFile = "temp.txt";
        File oldFile = new File(filepath);
        File newFile = new File(tempFile);
        String drinkName = vm.model.getValueAt(selectedRow, 1).toString();
        String price = vm.model.getValueAt(selectedRow, 2).toString();
        String drinkQuantity = vm.model.getValueAt(selectedRow, 3).toString();
        String line;

        try {
            FileWriter fw = new FileWriter(tempFile, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);
            BufferedReader br = new BufferedReader(new FileReader("drinks.txt"));

            while((line = br.readLine()) != null){
                if (drinkName.equals(editTerm)) {
                   line = line.replace(oldAmount, newAmount);
                   pw.println(line);
               } else {
                   pw.println(line);
                   System.out.println(selectedRow);
               }               
            }

            br.close();
            pw.flush();
            pw.close();
            oldFile.delete();
            File dump = new File(filepath);
            newFile.renameTo(dump);
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Failed to edit", "Edit failed", JOptionPane.INFORMATION_MESSAGE);
        }
    }

编辑

A 类 = 自动售货机

B 类 = 饮料

所以我用谷歌搜索了一下,发现了如何将 A 类的对象传递给 B 类,并用下面的代码做到了。

    private VendingMachine vm;
    public Drinks(VendingMachine vm) {
        this.vm = vm;
    }

然后在按钮中调用该方法,如下所示:

   VendingMachine vm = new VendingMachine();
   Drinks drinks = new Drinks(vm);
   drinks.purchaseDrink(...);

但是该selectedRow()方法仍然返回 -1 而不是选择的行。我错过了什么??

标签: javaswing

解决方案


推荐阅读