我有一个JPanel,在其中跟踪鼠标指针在移动时的位置。我将其存储在某些字段中。如何访问吸气剂以读取另一个对象中已创建对象的字段?
这只是一个例子,我在不使用静态变量的情况下努力进行对象通信。
一些代码:
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. ****
}
}
谢谢!
最佳答案
有很多可能的解决方案。
实例范围
如果需要在MainPanel
范围内使用Something
(例如,Something
上的几种方法将使用MainPanel
,并且MainPanel
上的中间状态很重要)。
将您的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);
和/或公开一个setter:
如果即使没有
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
中保留对Something
的引用),则可以将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
直接处理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 %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));
关于java - Java中的对象通信,没有带有getter和setter的静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22187225/