2016-02-14 4 views
0

У меня есть Person класса для описания некоторых особенностей человека:Параметров, проходящие в конструкторах - Java

public class Person { 

    private String name; 
    private String surname; 
    private String birthPlace; 
    private int age; 

    public Person(String name, String surname, String birthPlace, int age) { 
     super(); 
     this.name = name; 
     this.surname = surname; 
     this.birthPlace = birthPlace; 
     this.age = age; 
    } 
    public String getName() { 
     return name; 
    } 
    public String getSurname() { 
     return surname; 
    } 
    public String getBirthPlace() { 
     return birthPlace; 
    } 
    public int getAge() { 
     return age; 
    } 
} 

В PersonDemo классе я создаю 4-х человек, и добавить их к ArrayList<Person>. Тогда я передать ArrayList<Person> к Frame класса (который расширяет JFrame):

import java.util.ArrayList; 

public class PersonDemo { 

    public static void main(String[] args) { 

     Person p1 = new Person("Cristiano","Ronaldo","Santo Antonio", 31); 
     Person p2 = new Person("Zlatan","Ibrahimovic","Malmo", 34); 
     Person p3 = new Person("Alessandro","Del Piero", "Conegliano", 41); 
     Person p4 = new Person("Zinedine","Zidane","Marseille",43); 

     //ArrayList<Person> 
     ArrayList<Person> people = new ArrayList<>(); 
     people.add(p1); 
     people.add(p2); 
     people.add(p3); 
     people.add(p4); 

     //Create and make visible a new Frame() f passing 
     //as parameter the previous ArrayList<Person> 
     Frame f = new Frame(people); 
     f.setVisible(true); 
    } 
} 

Я разделил свой кадр с JSplitPane:

import java.util.ArrayList; 

import javax.swing.JFrame; 

public class Frame extends JFrame{ 

    private static final long serialVersionUID = 1L; 
    private static final int X_AXIS = 175; 
    private static final int Y_AXIS = 25; 
    private static final int WIDTH= 930; 
    private static final int HEIGHT = 600; 

    private SplitPane splitPane; 

    public Frame(ArrayList<Person> p) { 

     this.setTitle("My Frame"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setBounds(X_AXIS,Y_AXIS,WIDTH,HEIGHT); 

     //pass to the splitPane the ArrayList<Person> p 
     splitPane = new SplitPane(p); 
     this.getContentPane().add(splitPane); 

    } 
} 

В левой части JSplitPane создать новый JPanel; в этом JPanel я должен работать на ArrayList<Person>:

import java.util.ArrayList; 
import javax.swing.JPanel; 
import javax.swing.JSplitPane; 

public class SplitPane extends JSplitPane{ 

    private static final long serialVersionUID = 1L; 
    private static final int SPLIT_WEIGHT = 250; 
    private JPanel leftPanel; 

    public SplitPane(ArrayList<Person> p) { 

     //pass to the JPanel leftPanel the ArrayList<Person> p 
     leftPanel = new LeftPanel(p); 
     this.setOrientation(JSplitPane.HORIZONTAL_SPLIT); 
     this.setDividerLocation(SPLIT_WEIGHT); 
     this.setLeftComponent(leftPanel); 
    } 
} 

Это мой LeftPanel класс, который расширяет JPanel:

import java.util.ArrayList; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class LeftPanel extends JPanel{ 

    private static final long serialVersionUID = 1L; 

    public LeftPanel(ArrayList<Person> p) { 

     JLabel label = new JLabel("This is the left side of \"My Frame\""); 
     this.add(label); 

     //some code to work with ArrayList<Person> p in this JPanel 
    } 
} 

Интересно ли передать ArrayList<Person> в конструкторах (JFrame -> JSplitPane -> JPanel) хороший подход или есть лучшие решения (возможно, наследование).

+0

Этот подход полностью прекрасен; зависимости одного класса сразу становятся ясными при передаче конструктором. Наследование не имеет смысла в этом случае.Кроме того, вы можете рассмотреть возможность определения ваших GUI-классов, вложенных в один класс, где вы можете напрямую обращаться к «List » (в случае, если вам не нужно повторно использовать эти классы). – qqilihq

+0

Этот тип вопроса лучше подходит для CodeReview или Programmers. Я предлагаю вам * внимательно прочитать * их страницы справочного центра о запросе, а затем отформатировать свой вопрос в соответствии с тем, который лучше подходит для вашего вопроса. Вы можете пинговать меня, если хотите еще пару глаз, а затем флаг для модератора для миграции. – user1803551

ответ

3

Общая стратегия реализации программ пользовательского интерфейса заключается в использовании подхода Model-View-Controller. В вашей программе классы Swing были бы вид, а Person и ArrayList<Person> - модель.

Для просмотра требуемых деталей необходимо использовать данные модели, чтобы отображать соответствующие детали для конечных пользователей. Есть три распространенных способа предоставления виды доступа к соответствующим частям модели: части модели

  • Pass в конструкторе - это подход, который вы взяли,
  • Марка Модель одноэлементно - этот подход позволяет всем представлениям обращаться ко всем частям модели,
  • Использование инверсии управляющих контейнеров - это расширенный подход, который позволяет настраивать доступ декларативным способом.

Третий подход, вероятно, слишком продвинутым для маленькой программы, которую вы разработки, но синглтон может работать лучше, чем передача списков в явном виде:

class Model { 
    private static List<Person> people; 
    public static List<Person> getPeople() { 
     return people; 
    } 
    public static void setPeople(List<Person> people) { 
     this.people = people; 
    } 
} 

Теперь ваш main бы сделать это:

Person p1 = new Person("Cristiano","Ronaldo","Santo Antonio", 31); 
Person p2 = new Person("Zlatan","Ibrahimovic","Malmo", 34); 
Person p3 = new Person("Alessandro","Del Piero", "Conegliano", 41); 
Person p4 = new Person("Zinedine","Zidane","Marseille",43); 

//ArrayList<Person> 
ArrayList<Person> people = new ArrayList<>(); 
people.add(p1); 
people.add(p2); 
people.add(p3); 
people.add(p4); 
Model.setPeople(people); 

Ваши классы разворота больше не будут проходить около ArrayList<Person>. Вместо этого они будут делать Model.getPeople() каждый раз, когда им нужно получить доступ к List<Person>.

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