Hallo zusammen,
ich weiß zum Thema Swing und MVC gab es in letzter Zeit genug Diskussionen. Ich wage zu zwar zu behaupten, ich habe es soweit verstanden, aber ich habe immer wieder das Problem, wie man zwei Views miteinander verbindet, wenn diese miteinander interagieren sollen...
Achtung, ich poste jetzt viel Code, hoffe aber das mir trotzdem jemand hilft.
Zuerst mein DomainModel + dessen DAO
Nun die Mainklasse, über die die GUI gestartet wird:
Soweit so gut, jetzt zur Person Overview:
Jetzt kommt das Problem. Zur Übersicht soll man über den Klick auf einen Button noch weitere Details zur Person angezeigt bekommen. Dafür müsste aber der nun kommende Controller ja irgendwie die Liste aus der Übersicht kennen, wie löst man dies nun elegant?
Hoffe das trotz des langen Posts und des vielen Codes mir jemand hilft (dafür kann man es halt kompilieren.
ich weiß zum Thema Swing und MVC gab es in letzter Zeit genug Diskussionen. Ich wage zu zwar zu behaupten, ich habe es soweit verstanden, aber ich habe immer wieder das Problem, wie man zwei Views miteinander verbindet, wenn diese miteinander interagieren sollen...
Achtung, ich poste jetzt viel Code, hoffe aber das mir trotzdem jemand hilft.
Zuerst mein DomainModel + dessen DAO
Java:
import java.util.Observable;
public class Person extends Observable {
private String mForename;
private String mSurname;
public Person(String theForename, String theSurname) {
mForename = theForename;
mSurname = theSurname;
}
public String getForename() {
return mForename;
}
public void setForename(String theForename) {
mForename = theForename;
setChanged();
notifyObservers();
}
public String getSurname() {
return mSurname;
}
public void setSurname(String theSurname) {
mSurname = theSurname;
setChanged();
notifyObservers();
}
@Override
public String toString() {
return mSurname + ", " + mForename;
}
}
Java:
import java.util.LinkedList;
import java.util.List;
public class PersonDao {
private List<Person> persons;
public PersonDao() {
persons = new LinkedList<Person>();
dummyPersons();
}
public List<Person> getAllPersons() {
return persons;
}
private void dummyPersons() {
for (int i = 0; i < 10; i++) {
String name = "Test " + i;
persons.add(new Person(name, name));
}
}
}
Nun die Mainklasse, über die die GUI gestartet wird:
Java:
import java.awt.BorderLayout;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Main {
private PersonDao mPersonDao;
private JFrame mFrame;
private PersonsOverviewController mPersonOvCon;
private PersonsDetailController mPersonDetCon;
public Main() {
mPersonDao = new PersonDao();
mPersonOvCon = new PersonsOverviewController(new DefaultListModel());
mPersonOvCon.setPersonDao(mPersonDao);
mPersonDetCon = new PersonsDetailController();
init();
}
public void show() {
mFrame.setVisible(true);
}
private void init() {
mFrame = new JFrame("Persons");
mFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mFrame.add(mPersonOvCon.getView(), BorderLayout.WEST);
mFrame.add(mPersonDetCon.getView(), BorderLayout.EAST);
mFrame.pack();
mFrame.setLocationRelativeTo(null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main().show();
}
});
}
}
Soweit so gut, jetzt zur Person Overview:
Java:
import javax.swing.DefaultListModel;
import javax.swing.JPanel;
public class PersonsOverviewController {
private PersonDao mPersonDao;
private DefaultListModel mListModel;
private PersonsOverviewPanel mPersonOvView;
public PersonsOverviewController(DefaultListModel theListModel) {
mListModel = theListModel;
mPersonOvView = new PersonsOverviewPanel(mListModel, this);
}
public void setPersonDao(PersonDao thePersonDao) {
mPersonDao = thePersonDao;
}
public void getAllPersons() {
mListModel.clear();
List<Person> persons = mPersonDao.getAllPersons();
for (Person eachPerson : persons) {
mListModel.addElement(eachPerson);
}
}
public JPanel getView() {
return mPersonOvView;
}
}
Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class PersonsOverviewPanel extends JPanel {
private static final long serialVersionUID = 1L;
private DefaultListModel mListModel;
private PersonsOverviewController mController;
public PersonsOverviewPanel(DefaultListModel theListModel,
PersonsOverviewController theController) {
super(new GridBagLayout());
mListModel = theListModel;
mController = theController;
init();
}
private void init() {
JButton getPersonsBtn = new JButton("Get persons");
getPersonsBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent theE) {
mController.getAllPersons();
}
});
JList personsList = new JList(mListModel);
JScrollPane personsListScroll = new JScrollPane(personsList);
GridBagConstraints c = new GridBagConstraints();
add(getPersonsBtn, c);
c.gridy = 1;
add(personsListScroll, c);
}
}
Jetzt kommt das Problem. Zur Übersicht soll man über den Klick auf einen Button noch weitere Details zur Person angezeigt bekommen. Dafür müsste aber der nun kommende Controller ja irgendwie die Liste aus der Übersicht kennen, wie löst man dies nun elegant?
Java:
public class PersonsDetailController {
private Person mModel;
private PersonsDetailPanel mView;
public PersonsDetailController() {
mModel = new Person("", "");
mView = new PersonsDetailPanel(mModel, this);
mModel.addObserver(mView);
}
public void showPersonDetails() {
// Get selected person from PersonsDetailPanel
mModel.setForename("Foo");
mModel.setSurname("Bar");
}
public PersonsDetailPanel getView() {
return mView;
}
}
Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class PersonsDetailPanel extends JPanel implements Observer {
private static final long serialVersionUID = 1L;
private JLabel mForenameLbl;
private JLabel mSurnameLbl;
private Person mModel;
private PersonsDetailController mController;
public PersonsDetailPanel(Person theModel,
PersonsDetailController theController) {
super(new GridBagLayout());
mModel = theModel;
mController = theController;
init();
}
private void init() {
JButton getPersoBtn = new JButton("View Details");
getPersoBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent theE) {
mController.showPersonDetails();
}
});
mForenameLbl = new JLabel();
mSurnameLbl = new JLabel();
GridBagConstraints c = new GridBagConstraints();
add(getPersoBtn, c);
c.gridy = 1;
add(new JLabel("Forename: "), c);
c.gridx = 1;
add(mForenameLbl, c);
c.gridy = 2;
c.gridx = 0;
add(new JLabel("Surname: "), c);
c.gridx = 1;
add(mSurnameLbl, c);
}
@Override
public void update(Observable theO, Object theArg) {
mForenameLbl.setText(mModel.getForename());
mSurnameLbl.setText(mModel.getSurname());
}
}
Hoffe das trotz des langen Posts und des vielen Codes mir jemand hilft (dafür kann man es halt kompilieren.