2015-11-08 6 views
1

Мне нужна помощь при передаче объекта из одного класса в другой, который расширяет JFrame, всякий раз, когда вызывается этот метод. Пока это то, что у меня есть. Мне нужно передать добавленный круг в класс NodeTracker и убедиться, что он отображает добавленный объект.Пропустить объект в класс, который расширяет JFrame

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

Большое вам спасибо.

ответ

2

// Здесь я хочу реализовать метод, который позволяет мне пройти «с» в NodeTracker»

Нет, вы не. Вы хотите реализовать Observer Pattern. Nodes«не должен т уход, который прослушивает изменения, только что, когда addCircle называется, он расскажет им.

Этот способ NodeTracker бы зарегистрировать интерес Nodes быть сказанным, когда круг добавляется и затем быть в состоянии реагировать в некоторый осмысленный способ

Это довольно ключевое понятие в Swing, и реализуется через это «слушатель» API

Start путем определения 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); 
    } 
} 
+0

бил меня на удар (опять же!)! –

+0

Должен ли я создать новый класс, который соблюдает любые изменения? – user287474

+0

@ user287474 Это полностью зависит от вас и вашего дизайна – MadProgrammer

 Смежные вопросы

  • Нет связанных вопросов^_^