簡體   English   中英

超出其范圍的Java對象

[英]Java object to be accessed outside of its 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())實例化;

您可以將對象定義為類中的成員字段:

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();

有幾種方法可以解決此問題。 一種是獲取對主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實例的方法(在這里我稱為setTaxi(...) ) 。

另一種方法是讓您的Control類(上面的Create類)修改程序的Model對象。 視圖(GUI)將在模型中包含偵聽器,並在模型更改時更改其顯示。 這稱為MVC或“模型-視圖-控件”設計模式,在允許您分離關注點時非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM