Hallo!
Mein Problem ist ein nicht ganz GUI- und auch nicht Java-spezifisch, es stellt sich mir aber in diesem Zusammenhang. Auch gibt es hier wahrscheinlich kein richtig oder falsch aber wahrscheinlich hat sich eine Herangehensweise als die beste herauskristalisert.
Wie es aussieht: Ein Programm in einem Frame, Menüleiste, Toolbar und TabPanel. In jedem Tab befindet sich ein JPanel mit mehreren Componenten wie Buttons, Listen usw. die zur Anzeige und Manipulation von Daten über ein Netzwerk dienen. Jedes Tab repräsentiert eine eigene Verbindung zu einem Server.
Die Frage ist nun, wo sollte der Zustand, die Sessioninformation was die Verbindung zum Server angeht gespeichert werden? Als Felder in einer Subclass des JPanels, also gekapselt nahe der Darstellung?
Oder als Objekte in einer globalen Liste/Map?
Handelt es sich bei zu haltenden Daten um welche die in einer Component dargestellt werden kommen die in dessen Model. Nur Metainformationen einer Session gehören doch an sich keiner Componente. Globale Arrays andererseits passen irgendwie nicht in OOP und MVC.
Beides hat seine Vor- und Nachteile. In beiden Fällen muß jede Componenteninstanz die Zugriff auf die Daten benötigt wissen zu welcher Session bzw. welchem Session Panel sie gehört. In der lokalen Variante müssen zusätzlich alle Accessorfunktionen bis zur Datenklasse durchgereicht werden.
Gibt es bessere Methoden?
Nachfolgend minimale (nicht lauffähige und auf Fehlerprüfung verzichtende) Beispiele zu beiden Herangehensweisen. Für die, die lieber Code lesen.
Local
Global
Mein Problem ist ein nicht ganz GUI- und auch nicht Java-spezifisch, es stellt sich mir aber in diesem Zusammenhang. Auch gibt es hier wahrscheinlich kein richtig oder falsch aber wahrscheinlich hat sich eine Herangehensweise als die beste herauskristalisert.
Wie es aussieht: Ein Programm in einem Frame, Menüleiste, Toolbar und TabPanel. In jedem Tab befindet sich ein JPanel mit mehreren Componenten wie Buttons, Listen usw. die zur Anzeige und Manipulation von Daten über ein Netzwerk dienen. Jedes Tab repräsentiert eine eigene Verbindung zu einem Server.
Die Frage ist nun, wo sollte der Zustand, die Sessioninformation was die Verbindung zum Server angeht gespeichert werden? Als Felder in einer Subclass des JPanels, also gekapselt nahe der Darstellung?
Oder als Objekte in einer globalen Liste/Map?
Handelt es sich bei zu haltenden Daten um welche die in einer Component dargestellt werden kommen die in dessen Model. Nur Metainformationen einer Session gehören doch an sich keiner Componente. Globale Arrays andererseits passen irgendwie nicht in OOP und MVC.
Beides hat seine Vor- und Nachteile. In beiden Fällen muß jede Componenteninstanz die Zugriff auf die Daten benötigt wissen zu welcher Session bzw. welchem Session Panel sie gehört. In der lokalen Variante müssen zusätzlich alle Accessorfunktionen bis zur Datenklasse durchgereicht werden.
Gibt es bessere Methoden?
Nachfolgend minimale (nicht lauffähige und auf Fehlerprüfung verzichtende) Beispiele zu beiden Herangehensweisen. Für die, die lieber Code lesen.
Local
Java:
public class LocalState extends JFrame {
public static void main(String[] args) {
LocalState main = new LocalState();
main.initGUI();
}
private void initGUI() {
final JTabbedPane tabPane = new JTabbedPane();
JToolBar toolbar = new JToolBar();
JButton tButton = new JButton();
tButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SessionPane sp = (SessionPane) tabPane.getSelectedComponent();
sp.setOnline(true);
}
});
toolbar.add(tButton);
getContentPane().add(toolbar, BorderLayout.NORTH);
JPanel mainPane = new JPanel();
getContentPane().add(mainPane, BorderLayout.CENTER);
mainPane.add(tabPane);
Object tab = tabPane.add("empty1", new SessionPane());
Session.addSession(tab);
}
}
class SessionPane extends JPanel {
Session2 session = new Session2();
public SessionPane() {
JButton button = new MyButton(session);
add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
session.setOnline(true);
}
});
}
public void setOnline(boolean b) {
session.setOnline(b);
}
// Mehr Accessor-Methoden für Session
}
class MyButton extends JButton {
private final Session2 session;
public MyButton(Session2 s) {
session = s;
JButton button = new JButton();
add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
session.setOnline(true);
}
});
add(new JList());
}
}
class Session2 {
private String host = null;
private boolean online = false;
private String page = null;
public Session2() {
}
public void setOnline(boolean b) {
online = b;
}
// Mehr Accessor-Methoden
}
Global
Java:
class Session {
public static HashMap<Object, Session> hm = new HashMap<Object, Session>();
private String host = null;
private boolean online = false;
private String page = null;
public Session() {
}
public static void addSession(Object o) {
hm.put(o, new Session());
}
public void setOnline(boolean b) {
online = b;
}
// Mehr Accessor-Methoden
}
public class GlobalState extends JFrame {
public static void main(String[] args) {
GlobalState main = new GlobalState();
main.initGUI();
}
private void initGUI() {
final JTabbedPane tabPane = new JTabbedPane();
JToolBar toolbar = new JToolBar();
JButton tButton = new JButton();
tButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Object o = tabPane.getSelectedComponent();
Session.hm.get(o).setOnline(true);
}
});
toolbar.add(tButton);
getContentPane().add(toolbar, BorderLayout.NORTH);
JPanel mainPane = new JPanel();
getContentPane().add(mainPane, BorderLayout.CENTER);
mainPane.add(tabPane);
Object tab = tabPane.add("empty1", new SessionPane());
Session.addSession(tab);
}
}
class SessionPane extends JPanel {
public SessionPane() {
JButton button = new MyButton(this);
add(button);
}
}
class MyButton extends JButton {
private final SessionPane sessionPane;
public MyButton(SessionPane sp) {
sessionPane = sp;
JButton button = new JButton();
add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Session.hm.get(sessionPane).setOnline(true);
}
});
add(new JList());
}
}