我有一个JPanel,当鼠标指针移动时,我会在其中跟踪鼠标指针的位置。我把它储存在一些田地里。如何访问getter来读取另一个对象中已经创建的对象的字段?
这只是一个例子,我很难在不使用静态变量的情况下获得对象通信。
部分代码:
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. ****
}
}
谢谢!
有几种可能的解决方案。
实例范围
如果您需要从Something
范围访问MainPanel
(即,Something
中的几个方法将使用MainPanel
,而MainPanel
中的中间状态很重要)。
将您的MainPanel
实例传递给Something
。
使用构造函数:
如果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 %dn", mainPanel.getX(),
mainPanel.getY());
}
}
初始化代码:
MainPanel mainPanel = new MainPanel();
// ... put panel in frame, etc
Something something = new Something(mainPanel);
使用setter:
如果Something
即使没有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
的状态(不希望在Something
中保留对MainPanel
的引用),则可以在需要的地方传递MainPanel
的实例。这是独立方法的最佳策略。即使Something
中的几个方法需要访问MainPanel
,也没有必要将MainPanel
存储为字段,除非这些方法以某种方式"是";一起工作";关于MainPanel
:的一个实例
public void myMethod(MainPanel mainPanel) {
System.out.printf("Mouse postion: %d x %dn", mainPanel.getX(),
mainPanel.getY());
}
用法示例:
MainPanel mainPanel = new MainPanel();
Something something = new Something();
something.myMethod(mainPanel);
最后,除了考虑变量范围之外,还应该考虑API真正需要什么才能工作。Something
需要访问MainPanel
还是只访问鼠标坐标?如果只需要后者,让Something
直接处理x
和y
,或者引入一个中间对象(如果你能写一个接口,那就更好了),并将Something
与MainPanel
:解耦
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 %dn", 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));