[英]Java class variables are updating inconsistently between classes
一般来说,我的目标是绘制由用户的 cursor 定义的线条。 为了实现这一点,我在一个 class 中计算出这些线条的计算,然后更新用这些新值绘制线条的 class。 总的来说,我想访问 cursor 所在的线段列表、节点列表和当前抽象“节点”。 (节点和线段是我自己定义的类)。 绘制线条的 class 称为 GraphicsPanel。
我在类之间设置访问权限,如下所示:
public class MainClass extends JFrame {
protected static ArrayList<LineSegment> lineList = new ArrayList<LineSegment>();
protected static ArrayList<Node> nodeList = new ArrayList<Node>();
protected static Node current = new Node();
// Code for calculations and user interactions
{
GraphicsPanel displayPanel = new GraphicsPanel();
// Values are updated
displayPanel.revalidate();
displayPanel.repaint();
}
}
public class GraphicsPanel extends JPanel {
private ArrayList<LineSegment> lineList = package.MainClass. lineList;
private ArrayList<Node> nodeList = package.MainClass.nodeList;
private Node current = package.MainClass.current;
public GraphicsPanel() {
}
public void paint(Graphics g) {
// Paint lines and other shapes
}
}
虽然 lineList 和 nodeList 对象在将新 LineSegment 或 Node 添加到列表时会正确更新,但当前 Node 永远不会更新,并且始终显示默认值 (0, 0)。
例如,在主 class 中,我有两个鼠标监听器,一个用于鼠标点击,一个用于鼠标移动。 它们有类似的功能,但是鼠标点击监听器同时更新当前节点和 LineSegments 的 lineList ArrayList。
displayPanel.addMouseListener(new MouseListener() {
@Override
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
current = new Node(p.getX(), p.getY());
lineList.add(new LineSegment(current, current);
// Don't worry, the line segment gets updated (correctly) with a new end node as
// the cursor moves around the window
displayPanel.revalidate();
displayPanel.repaint();
}
});
当我单击 window 创建线条时,线条按预期显示,但当前节点仍位于 (0, 0)。 我对此完全感到震惊,因为似乎只有一个变量正在更新,即使两者都以基本相同的方式写入更新:我修改主 class 中的 class 变量的实例,这应该修改实例GraphicsPanel class 中的变量。
感谢您对这个难题的任何帮助,并欢迎就问题所在提出建议,以及处理此应用程序的更好方法。
您不修改实例,而是创建一个new
实例,替换旧实例。 这意味着GraphicsPanel.current
将继续指向原始实例,但MainClass.current
将指向一个新的距离。
如果你做了类似instance.setY(p.getY())
的事情,它会修改两个类都指向的单个原始实例。
您的 MouseListener 将对象添加到 Main class 列表中。
然后它为面板参考电流分配一个不同的新 object。 但这不会改变主要的 class 参考!
您可能只是在面板代码中没有另一个当前引用。 只需直接分配给属于 Main 类的当前实例!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.