将Object传递给扩展JFrame的类

时间:2015-11-08 23:00:57

标签: java swing jframe jtable observers

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

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 );
    }
}

非常感谢你。

1 个答案:

答案 0 :(得分:2)

  

//这里我想实现一个允许我将“c”传递给NodeTracker“

的方法

不,你没有。您想实现Observer PatternNodes不应该关心谁正在倾听变化,只有在调用addCircle时才会告诉他们。

这样NodeTracker会在添加一个圆圈时注意对Nodes的兴趣,然后能够以某种有意义的方式回复

这是Swing中一个非常关键的概念,并通过它的“监听器”API

实现

首先定义interface,其中描述了Nodes类将生成的事件

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

接下来,将对新侦听器的支持添加到Nodes,允许其他类注册/取消注册兴趣并实际触发事件

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的实例或将预先存在的实例传递给该类,并注册您对从中获取通知的兴趣......

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);
    }
}