要在其范围之外访问的Java对象

时间:2014-11-11 22:05:15

标签: java scope

我参加了一个java课程,作为我下一个程序的要求的一部分,我需要一个实例化我的对象的按钮,然后用它执行各种任务。我的问题是,一旦我在actionlistener中创建了我的对象,它接收到按钮的点击,我现在如何使用该对象?

public class Create implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        AdvancedAcmeTaxi taxi = new AdvancedAcmeTaxi(Double.parseDouble(input.getText()));
        selection.setEnabled(true);
        btnCreate.setEnabled(false);
    }

}

所以在上面的代码中我有我的自定义监听器,然后我创建了对象,但由于范围我只能在这里访问它。我该如何解决?请注意,对于本课程的权限,没有控制器。只是模型和视图。这是我的GUI类中的嵌套类。它是由实例化的     btnCreate.addActionListener(new Create());

2 个答案:

答案 0 :(得分:1)

您可以将对象定义为类中的成员字段:

public class Create implements ActionListener {

   private AdvancedAcmeTaxi taxi;

   // getter method for field
   public AdvancedAcmeTaxi getTaxi() {
      return taxi;
   }

   public Create() {
      ...
   }
   ...

   @Override
   public void actionPerformed(ActionEvent e) {
       taxi = new AdvancedAcmeTaxi(Double.parseDouble(input.getText()));;
       selection.setEnabled(true);
       btnCreate.setEnabled(false);
   }

}

添加侦听器后,您可以按如下方式访问该字段:

Create listener = new Create();
btnCreate.addActionListener(listener);

...
AdvancedAcmeTaxi taxi = listener.getTaxi();

答案 1 :(得分:1)

有几种方法可以解决这个问题。一种是获取对主GUI的引用,然后调用一个方法:

public class Create implements ActionListener {
    private MainGui mainGui;

    public Create(MainGui mainGui) {
        this.mainGui = mainGui;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        AdvancedAcmeTaxi taxi = new AdvancedAcmeTaxi(Double.parseDouble(input.getText()));;
        selection.setEnabled(true);
        btnCreate.setEnabled(false);

        mainGui.setTaxi(taxi);
    }
}

当你调用它的构造函数时,你必须将Current MainGui的引用传递给这个类,这将假设MainGui有一些方法可以处理你的Taxi实例(这里我称之为{{1} })。

另一种方法是让您的 Control 类(上面的Create类)修改程序的 Model 对象。视图(GUI)将有监听器进入模型,并在模型更改时更改其显示。这称为MVC或模型 - 视图 - 控制设计模式,它可以非常有用,可以让您分离您的顾虑。