将对象传递到扩展 JFrame 的 class

Pass Object into class that extends JFrame

我需要帮助将对象从一个 class 传递到另一个扩展 JFrame 的对象,无论何时调用该方法。到目前为止,这就是我所拥有的。我需要将添加的圆传递给 NodeTracker class 并确保它显示添加的对象。

public class Nodes
{
   ArrayList<Circle> circles;
   ArrayList<Squares> squares;

   public Node()
   {
       circles = new ArrayList<Circles>();
       squares = new ArrayList<Squares>();
   }

   public void addCircle(Circle c)
   {
       circles.add(c);
       // Here I want to implement a method that allows me to pass "c"
       // to the NodeTracker
   }

}

// All I have so far that opens a blank table.
public class NodeTracker extends JFrame 
{

    private JPanel topPanel;
    private JTable table;
    private JScrollPane scrollPane;

    public NodeTracker()
    {
        setTitle("Node Tracker");
        setSize(700, 700);

        topPanel = new JPanel();
        topPanel.setLayout(new BorderLayout());
        getContentPane().add(topPanel);

        String columns[] = { "Color", "Radius" };

        String data[][] =
        {
            //whenever added, would update
            //{circle.color, circle.radius},
            //{circle.color, circle.radius}
        };

        table = new JTable(data, columns);

        scrollPane = new JScrollPane(table);
        topPanel.add(scrollPane, BorderLayout.CENTER);
    }

    //Temporary
    public static void main( String args[] )
    {
        NodeTracker mainFrame = new NodeTracker();
        mainFrame.setVisible( true );
    }
}

非常感谢。

// Here I want to implement a method that allows me to pass "c" to the NodeTracker"

不,你不知道。你想实现一个 Observer PatternNodes 不应该关心谁在监听变化,只有当 addCircle 被调用时,它会告诉他们。

这样 NodeTracker 会注册对 Nodes 的兴趣,以便在添加圈子时被告知,然后能够以某种有意义的方式做出回应

这是 Swing 中一个非常关键的概念,并通过它实现 "listener" API

首先定义一个 interface,它描述 Nodes class 将生成的事件

public interface NodesListener {
    public void nodesCircleWasAdded(Nodes source, Circle circle);
}

接下来,将对新侦听器的支持添加到 Nodes 中,让其他 class 感兴趣 register/deregister 并实际触发事件

public class Nodes {

    ArrayList<Circle> circles;
    ArrayList<Squares> squares;
    private List<NodesListener> listeners;

    public Nodes() {
        circles = new ArrayList<Circles>();
        squares = new ArrayList<Squares>();
        listeners = new ArrayList<>(25);
    }

    public void addNodesListener(NodesListener listener) {
        listeners.add(listener);
    }

    public void addCircle(Circle c) {
        circles.add(c);
        for (NodesListener listener : listeners) {
            listener.nodesCircleWasAdded(this, c);
        }
    }

}

最后,创建 Nodes 的实例或将预先存在的实例传递给 class 并注册您对从中获取通知的兴趣...

public class NodeTracker extends JFrame {

    private JPanel topPanel;
    private JTable table;
    private JScrollPane scrollPane;
    private Nodes nodes;

    public NodeTracker() {
        setTitle("Node Tracker");
        setSize(700, 700);

        nodes = new Nodes();
        nodes.addNodesListener(new NodesListener() {
            @Override
            public void nodesCircleWasAdded(Nodes source, Circle circle) {
                // A circle was added
            }
        });

        topPanel = new JPanel();
        topPanel.setLayout(new BorderLayout());
        getContentPane().add(topPanel);

        String columns[] = {"Color", "Radius"};

        String data[][]
                        = { //whenever added, would update
                        //{circle.color, circle.radius},
                        //{circle.color, circle.radius}
                        };

        table = new JTable(data, columns);

        scrollPane = new JScrollPane(table);
        topPanel.add(scrollPane, BorderLayout.CENTER);
    }

    //Temporary
    public static void main(String args[]) {
        NodeTracker mainFrame = new NodeTracker();
        mainFrame.setVisible(true);
    }
}