【问题标题】:Listeners and instance variable scope [javafx]侦听器和实例变量范围 [javafx]
【发布时间】:2017-11-22 02:54:18
【问题描述】:

我无法理解为什么我无法在侦听器中获取对象的正确值。我创建了一个实例变量“植物”,它是“植物”的类型。然后在我的一种方法中,我创建了一个 Plant 对象并将其分配给“植物变量”。然后我设置了植物对象的一些字段,比如“name”和“id”。一切正常,但是...我创建了一个侦听器以在单击按钮后打开一个新窗口。对我来说奇怪的是,在这个监听器中,程序看不到我之前设置的植物对象字段。 这是我的代码:

class Plant {

    private plantName;
    private gridId;

    public String getName() {
        return plantName;
    }
    public void setName(String plantName) {
        this.plantName = plantName;
    }
    public int gridId() {
        return gridId;
    }
    public void setGridId(int gridId) {
        this.gridId = gridId;
    }
}

以下代码展示了 GrowboxModel 类的片段,其中设置了 Plant 对象的字段:

public Plant selectAll(int gridId) throws SQLException {
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    String query = "SELECT * FROM plant WHERE gridId = ?";
    Plant plant = new Plant();
    try {
        preparedStatement = connection.prepareStatement(query);
        preparedStatement.setInt(1, gridId);
        resultSet = preparedStatement.executeQuery();

        while(resultSet.next()) {
            plant.setName(resultSet.getString("name"));
            plant.setGridId(resultSet.getInt("gridId"));
        }


    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        preparedStatement.close();
        resultSet.close();
    }
    return plant;
}

下面是我的 growboxController 类的片段:

public Plant plant;
public GrowboxModel model = new GrowboxModel();

private void growboxCellContent(VBox plantAreaVbox) {
        plant = model.selectAll(Integer.parseInt(plantAreaVbox.getId()));
        if (plant.getName() == null) {
            plantName.setText("EMPTY  " + plantAreaVbox.getId());
        } else {
            System.out.println("FULL" + plant.getGridId());
        }
} 

现在一切都很好。对植物对象的字段进行编程。但问题如下:

public void growboxCellBehaviour(VBox plantAreaVbox) {  
    plantAreaVbox.setOnMouseClicked(new EventHandler<MouseEvent>() {
        public void handle(MouseEvent me) {
            System.out.println("NAME: " + plant.getName() + ", gridId: " + plant.getGridId());
        }
    });
}

这是“plant.getName()”等为空的时刻,虽然应该有相同的名称。

我知道如何创建解决方法,但想知道是否有人知道为什么侦听器看不到这些字段。

【问题讨论】:

  • 植物名称在哪里定义?它必须是 Plant 类的属性。方法 getGridId() 和 getDescription() 也丢失了。
  • 从未设置plantNameid 的值。
  • 大概您没有在调用setName() 的同一个Plant 实例上调用getName()。 (你甚至没有在任何地方显示你调用setName() 的地方,更不用说能够说明为什么会发生这种情况。创建一个minimal reproducible example。)
  • 抱歉,我编辑了这些空白,所以现在应该清楚了。我在同一个 Plant 实例上调用 getName() ,这就是为什么它对我来说如此奇怪。当我通过方法参数传递植物引用时,它可以工作,但如果它是全局实例,则不是。

标签: java sqlite javafx listener


【解决方案1】:

在植物类中,实际上没有分配任何内容,您需要实际设置变量。

class Plant {
String plantName;
int id;  
public String getName() {
    return plantName;
}
public void setName(String plantName1) {
    plantName = plantName1;
}
public int gridId() {
    return gridId;
}
public void setId(int id1) {
    id = id1;
}
}

【讨论】:

  • 对不起,我把代码放在这里时错过了。变量存在,我编辑了代码以显示
猜你喜欢
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
相关资源
最近更新 更多