hiho,
folgende Klassenstruktur hatte ich bevor ich vorm eigentlichen "Problem" stand diese Klassen ordentlich zu Verknüpfen:
So normalerweise hätte ich dafür nen Controller geschrieben. Dort würde sich die View registrieren und die Action müsste diesen dann ansprechen um die Daten rüberzuschieben.
Warum hab ich das nicht gemacht? Weil es ne Klasse mit nur einer Methode geworden wäre, welche wirklich wenig Code beinhalten würde. Weiterhin hätte ich Kopfstand machen müssen um den Controller sowohl bei der Action sowie bei der View bekannt zu machen. Da es sich dabei um 2 verschiedene Klassen handelt in welchen jeweils die View und die Action erzeuge müsste ich in in mindestens einem Fall über Delegation oder durchhangeln von getMethoden den Controller suchen. Das wollte ich vermeiden für diesen eher spärlichen Controller.
Was is da nun gestern in geistiger Umnachtung entstanden!?
Die Nutzung zum einbetten als Komponente erfolgt dann über getViewComponent, die Daten werden dann durch die Action mittels setData geändert.
So, das einzige was mich daran ein wenig stört, ich könnte theoretisch dem Rückgabewert von getViewComponent eine neue JComponent zuweisen (schon probiert - trotz final). Hätt ich nun nicht erwartet, aber nun weiss ichs ja
Weiterhin könnte ich natürlich von überall die setData-Methode aufrufen. Wenn ich den Controller aber per getMethoden suchen würde, dann könnte ich das genauso. Delegation wäre da wohl die sicherste Lösung für das Problem.
Seht ihr in diesem Konzept noch weitere Nachteile? Wie gesagt für mich macht es nicht mehr Sinn, wegen 3 Zeilen Logik nen Controller zu schreiben.
folgende Klassenstruktur hatte ich bevor ich vorm eigentlichen "Problem" stand diese Klassen ordentlich zu Verknüpfen:
Java:
public class MainFrame extends JFrame {
..
toolbar.add(new LoadPlacenamesAction());
..
}
Java:
public class MainPanel extends JPanel {
..
panel.add(new PlacenamesInfoView());
..
}
Java:
public class LoadPlacenamesAction extends AbstractAction {
..
Object[] data = GfeAccessor.readPlacenamesFromFile(fc.getSelectedFile()).toArray();
//Das nun an Placenamesview propagieren
..
}
Java:
public class PlacenamesInfoView extends JList {
}
So normalerweise hätte ich dafür nen Controller geschrieben. Dort würde sich die View registrieren und die Action müsste diesen dann ansprechen um die Daten rüberzuschieben.
Warum hab ich das nicht gemacht? Weil es ne Klasse mit nur einer Methode geworden wäre, welche wirklich wenig Code beinhalten würde. Weiterhin hätte ich Kopfstand machen müssen um den Controller sowohl bei der Action sowie bei der View bekannt zu machen. Da es sich dabei um 2 verschiedene Klassen handelt in welchen jeweils die View und die Action erzeuge müsste ich in in mindestens einem Fall über Delegation oder durchhangeln von getMethoden den Controller suchen. Das wollte ich vermeiden für diesen eher spärlichen Controller.
Was is da nun gestern in geistiger Umnachtung entstanden!?
Java:
package gfeGui.gui;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.DefaultListModel;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
public class PlacenamesInfoView {
private static final long serialVersionUID = -4235373112632007502L;
private static final JComponent view = setupViewComponent();
/**
* Setup view for placenames.
*/
private static JComponent setupViewComponent() {
JList list = new JList();
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.addMouseListener(new PlacenamesInfoView.ViewListener());
return list;
}//setup
/**
*
* @param data
*/
public static void setData(Object[] data) {
DefaultListModel newModel = new DefaultListModel();
for (Object o: data) {
System.out.println(o);
newModel.addElement(o);
}
((JList) view).setModel(newModel);
}//setData
/**
*
* @return
*/
public static JComponent getViewComponent() {
return view;
}//getViewComponent
/**
*
* @author Marcus Wuensche
*
*/
private static class ViewListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
if (e.getSource() == view)
System.out.println(((JList) e.getSource()).getSelectedValue());
}
}//mouseClicked
}//ViewListener
}//PlacenamesInfoView
Die Nutzung zum einbetten als Komponente erfolgt dann über getViewComponent, die Daten werden dann durch die Action mittels setData geändert.
So, das einzige was mich daran ein wenig stört, ich könnte theoretisch dem Rückgabewert von getViewComponent eine neue JComponent zuweisen (schon probiert - trotz final). Hätt ich nun nicht erwartet, aber nun weiss ichs ja
Seht ihr in diesem Konzept noch weitere Nachteile? Wie gesagt für mich macht es nicht mehr Sinn, wegen 3 Zeilen Logik nen Controller zu schreiben.
Zuletzt bearbeitet: