将对象传递到扩展 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 Pattern。 Nodes
不应该关心谁在监听变化,只有当 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);
}
}
我需要帮助将对象从一个 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 Pattern。 Nodes
不应该关心谁在监听变化,只有当 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);
}
}