我有一个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直接处理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));

关于java - Java中的对象通信,没有带有getter和setter的静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22187225/

10-09 03:21