我有一个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);
和/或公开一个二传手:
如果某项工作即使没有,也可以做到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
in中的引用Something
),则可以传递MainPanel
as实例的实参。这是独立方法的最佳策略。即使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));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句