繁体   English   中英

Java class 变量在类之间更新不一致

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM