2014-03-05 40 views
0

我有一個JPanel,當我移動時跟蹤鼠標指針的位置。我把它存儲到一些領域。我如何訪問getter來讀取另一個對象內已經創建的對象的字段?Java中沒有靜態變量的getter和setter對象通信

這只是一個例子,我很努力地獲得對象通信而不使用靜態變量。

一些代碼:

class MainPanel extends JPanel implements MouseMotionListener { 

    public int mouseX, mouseY 

    public MainPanel(){ 
    this.addMouseMotionListener(this); 
    ... 
    } 
    public void mouseMoved(MouseEvent e) { 

    this.MouseX = e.getX(); 
    this.MouseY = e.getY(); 

    } 

    public int getX(){ 

    return this.MouseX; 
    } 

    public int getY(){ 

    return this.MouseY; 
    } 
    ... 
    } 
} 

class Something{ 

*** I want to, for example, print on console the XY coordinates of the -object- 
MainPanel. **** 
} 
    } 

謝謝!

回答

3

有很多可能的解決方案。

實例範圍內

如果您在Something範圍需要MainPanel(例如,在Something幾種方法將使用MainPanelMainPanel的中間狀態是很重要的)。

將您的MainPanel實例傳遞給Something

使用構造函數:

如果事情不能做自己的工作,而不MainPanel

class Something { 
    private final MainPanel mainPanel; 

    public Something(MainPanel mainPanel) { 
     this.mainPanel = mainPanel; 
    } 

    public void myMethod() { 
     System.out.printf("Mouse cordinates: %d x %d\n", mainPanel.getX(), 
       mainPanel.getY()); 
    } 
} 

初始化代碼:

MainPanel mainPanel = new MainPanel(); 
// ... put panel in frame, etc 
Something something = new Something(mainPanel); 

和/或暴露二傳手:

如果事情可以做自己的工作,即使沒有MainPanel

class Something { 
    private MainPanel mainPanel; 

    public void setMainPanel(MainPanel mainPanel) { 
     this.mainPanel = mainPanel 
    } 

    // my other methods 
} 

初始化代碼:

MainPanel mainPanel = new MainPanel(); 
// ... put panel in frame, etc 
Something something = new Something(); 
something.setMainPanel(mainPanel); 

方法參數

如果您只需要在範圍的MainPanel狀態一種方法(你不想在中參考MainPanel 0)你可以傳遞一個MainPanel的實例作爲參數。這是獨立方法的最佳策略。即使在Something幾種方法需要訪問MainPanel,沒有一點存儲MainPanel作爲一個字段,除非這些方法在某種程度上對MainPanel的實例「一起工作」:

public void myMethod(MainPanel mainPanel) { 
    System.out.printf("Mouse postion: %d x %d\n", mainPanel.getX(), 
      mainPanel.getY()); 
} 

用例:

MainPanel mainPanel = new MainPanel(); 
Something something = new Something(); 
something.myMethod(mainPanel); 

最後,除了想到變量作用域,你應該考慮一下你的API真的需要什麼才能工作。 Something需要訪問MainPanel或只需鼠標的座標?如果只需要後者,有Something直接處理xy或引入中間對象(如果你可以寫一個接口就更好)和解耦SomethingMainPanel

class MainPanel extends JPanel implements MouseMotionListener { 

    public int mouseX, mouseY; 
    // everything else 

    public Point getMousePosition() { 
     return new Point(this.mouseX, this.mouseY); 
    } 
} 

而且在Something

public void myMethod(Point mousePosition) { 
    System.out.printf("Mouse position: %d x %d\n", mousePosition.getX(), 
      mousePosition.getY()); 
} 

爲什麼它更好? Something不知道MainPanel,它只知道約Point。您可以創建Points出你想要的東西,並將其發送給Something

用例:

MainPanel mainPanel = MainPanel(); 
MyOtherComponent myOtherComponent = MyOtherComponent(); 
Something something = new Something(); 
something.myMethod(mainPanel.getMousePosition()); 
something.myMethod(myOtherComponent.myMousePositionMethod()); 
// or even 
something.myMethod(new Point(1,1)); 
+0

我想這一點。但在我的現實生活中,它需要從3或4個不同的對象獲取信息。使用構造函數傳遞信息是否是一種好的做法? –

+1

@ GabrielA.Zorrilla,是的,沒關係。但是,如果你不喜歡帶有很多參數的構造函數,並且如果你將使用相同的對象來創建不同的其他對象,那麼你可能需要使用'builder pattern' – msangel

+0

擊敗我。 3或4是合理的。否則使用[builder pattern](http://en.wikipedia.org/wiki/Builder_pattern)([示例](http://stackoverflow.com/questions/5007355/builder-pattern-in-effective-java))。如果'Something'可以在沒有對象的情況下完成它的工作,那麼只能使用setters。另外,要注意併發問題。 –