[QUOTE=Akeshihiro]Mir kommt da gerade JOptionPane in den Sinn. Warum nicht eine von mir aus generische Dialog-Klasse implementieren, die konfigurierbar ist und über spezielle Methoden erzeugen lassen, die einen richtig konfiguerierten Dialog liefern und alles intern kapseln? [/QUOTE]Na das ist doch meine Frage: Wie konfiguriere ich so einen Dialog am besten.
[QUOTE=Akeshihiro;58854]Ein Löschen-Button gehört meines Erachtens nicht in so einen Edit-Dialog, sondern als gesonderter Button zu der Tabelle, ebenso auch ein Button zum Bearbeiten, da man nicht davon ausgehen kann, dass jeder auf die Idee kommt einen Datensatz zu doppelklicken. Löschen zudem deshalb, weil ich so mehrere Datensätze löschen könnte anstatt immer jeden Datensatz einzeln im Bearbeitungs-Dialog zu öffnen und dann endlich löschen zu dürfen. Zu umständlich und nervig. Import- und Export-Funktionalitäten würde ich auch nicht an die Dialoge kleben, da das eine mit dem anderen nichts zu tun hat. Würde ich ebenfalls als Buttons zu der Tabelle hinzufügen und aus den Dialogen schmeißen. Vor allem, weil die Dialoge dann die Logik für Import und Export haben müssten und das ist in meinen Augen nicht die Kernaufgabe der Dialoge. KISS eben.
Und ich könnte mir auch vorstellen, dass es viele Nutzer verwirren könnte, wenn die Buttons mit Grundfunktionalitäten, die man irgendwo in der Nähe der Tabelle erwarten würde, sonst wo suchen muss. Usability gleich null.[/QUOTE]Da setzt du aber gerade ne ganze Menge vorraus, wie meine Anwendung **möglicherweise **aufgebaut sein könnte, was hier aber auch gar nicht zur Diskussion steht. Und das Löschen eines Datensatzes bei der Bearbeitung mit anzubieten scheint mir gar nicht mal so weit hergeholt. Und falls es sich anbietet, werde ich bestimmte Dinge auch aus dem Dialog nehmen. Bin auch für eine hohe Usability.
Allerdings wären das alles Dinge, die größere Umbaumaßnahmen erfordern würden. Daher werden die Dialoge und ihre Funktionalität wohl erstmal so bleiben. Ich möchte hier auch ungern darüber diskutiueren, ob mein Problem sinnvoll ist oder nicht. Aktuell besteht es, und ich versuche es daher bestmöglich zu lösen (und bin dabei für jede Hilfe dankbar).
[QUOTE=Timothy_Truckle;58918]was haltet Ihr den
davon
[spoiler]```class MyDialog extends JDialog {
public enum DialogType {
EDIT {
protected void setTitle(MyDialog myDialog) {
myDialog.setTitle(„Datensatz bearbeiten“);
}
@Override
public List<JButton> getTypeButtons(final MyDialog myDialog) {
return Arrays.asList(//
new JButton(new AbstractAction("Speichern") {
@Override
public void actionPerformed(ActionEvent e) {
myDialog.updateRecord();
}
}), new JButton(new AbstractAction("Löschen") {
@Override
public void actionPerformed(ActionEvent arg0) {
myDialog.deleteRecord();
}
}));
}
},
CREATE {
@Override
protected void setTitle(MyDialog myDialog) {
myDialog.setTitle("neuer Datensatz");
}
@Override
public List<JButton> getTypeButtons(final MyDialog myDialog) {
return Arrays.asList(//
new JButton(new AbstractAction("Erzeugen") {
@Override
public void actionPerformed(ActionEvent e) {
myDialog.insertRecord();
}
}));
}
};
protected abstract void setTitle(MyDialog myDialog);
public abstract List<JButton> getTypeButtons(MyDialog myDialog);
public List<JComponent> getButtons(final MyDialog myDialog) {
ArrayList<JComponent> buttonList = new ArrayList<JComponent>(
getTypeButtons(myDialog));
buttonList.add(//
new JButton(new AbstractAction("Abbrechen") {
@Override
public void actionPerformed(ActionEvent e) {
myDialog.setVisible(false);
}
}));
return buttonList;
}
}
public MyDialog(DialogType type) {
JPanel buttons = new JPanel(new GridLayout(1, 0, 5, 5));
for (JComponent button : type.getButtons(this)) {
buttons.add(button);
}
JPanel bottom = new JPanel(new BorderLayout());
bottom.add(buttons, BorderLayout.EAST);
add(bottom, BorderLayout.SOUTH);
setSize(500, 150);
}
protected void deleteRecord() {
JOptionPane.showMessageDialog(this, "Datensatz gelöscht");
MyDialog.this.setVisible(false);
}
protected void updateRecord() {
JOptionPane.showMessageDialog(this, "Datensatz geändet");
MyDialog.this.setVisible(false);
}
protected void insertRecord() {
JOptionPane.showMessageDialog(this, "Datensatz angelegt");
MyDialog.this.setVisible(false);
}
}```[/spoiler]
?
bye
TT[/QUOTE]Ja, die Idee ist gut. Allerdings habe ich nicht nur den einen Dialog, sondern auch noch weitere 5 (oder mehr), für die ich dann ja jeweils ein Enum anlegen müsste!?
Allerdings erscheint mir die Idee, den Unterschied in eine Klasse oder Methode auszulagern schon sinnvoll. Die Frage ist eben noch, wie ich das am besten für viele Dialoge realisiere.
Mein aktueller Ansatz wäre, für jeden Dialog statisch eine Map<Type, DialogVariation> anzulegen, die ich dann mit den entsprechenden Instanzen fülle. Allerdings müsste ich diese Map dann für jede Subklasse anlegen, was mir auch ein wenig redundant erscheint (siehe dazu Thread hier).