Kommunikation zwischen zwei Fenstern und vorübergehende Speicherung der Eingaben

Belushi

Mitglied
Ich möchte gern eine Auswahl von Objekten dem Benutzer zur Verfügung stellen, die er durch eine ComboBox auswählen kann (oberer Bereich im Bild, Objects). Nach der Auswahl öffnet sich ein für das ausgewählte Objekt ein spezifisches Fenster mit GUI-Komponenten, um Objekteigenschaften einzustellen (unterer Bereich, Objectproperties).

Bspw. wählt der Benutzer ein Object aus, öffnet sich ein anderes Fenster in dem er die Eigenschaften festlegen kann kann. Diese Eigenschaften sollten zur Laufzeit gespeichert werden und bei gewollten nachträglichen Änderungen müssen die vorher bestimmten Werte wieder geladen werden, damit der Benutzer nicht irritiert wird.

Szenario:

Der Benutzer wählt als erstes ein ObjectA aus der Auswahlliste
Das Programm öffnet ein Objectpropertiesfenster für das ObjectA
Der Benutzer gibt den Wert für die Eigenschaft gleich 5 ein und bestätigt seine Eingabe

Der Benutzer wählt als zweites ein ObjectB aus der Auswahlliste
Das Programm öffnet ein Objectpropertiesfenster für das ObjectB
Der Benutzer gibt die Werte im Objectpropertiesfenster ein und bestätigt seine Eingabe

Der Benutzer wählt als drittes ein ObjectC aus der Auswahlliste
Das Programm öffnet ein Objectpropertiesfenster für das ObjectC
Der Benutzer gibt Werte ein und bestätigt seine Eingabe

Der Benutzer öffnet erneut die ComboBox von ObjectA, um seine Einstellungen zu ändern.
Das Programm öffnet das Filtereigenschaftsfenster mit den vorher definierten Eingaben
Der Benutzer ändert die Filtergröße von dem Wert 5 auf den Wert 2 und bestätigt seine Eingabe



Meine Fragen:

Frage I: Ist die ComboBox eine gute Lösung für die Auswahl der verschiedenen Objekte oder gibt es eine andere UI-Komponenet, die dafür besser geeignet sind? Ich denke, dass es kein Problem sein sollte, wenn ein Object aus der ComboBox ausgewählt ist, das dafür festgelegte Operatorpropertiefenster in seinen Bereich zu zeichen. Allerdings wie sieht es aus, wenn schon vorher Eingaben stattfanden? Wird das Fenster neu gezeichnet und anschließend nachgeschaut, ob Werte dafür zwischengespeichert sind, um diese später in das Fenster zu laden?

Frage II: Wie mache ich das mit dem Zwischenspeichern? Die Objects in eine Collection und bei Gebrauch von schon vorher definierten Objects immer in die GUI laden?

Das wären meine Fragen und Lösungsansätze. Ich würde gern ein paar Vorschlage von euch hören, was die übliche herangehensweise ist um ein solches Problem zu lösen. Code poste ich später nach.

Im Anhang findet ihr ein Beispiel der GUI:
 

Anhänge

  • GUI.png
    GUI.png
    18,2 KB · Aufrufe: 56
Hiho,

Ich denke deine GUI wird schnell an ihre Grenzen stoßen wenn du mehr als 5 Objekte benötigst.

Frage: Sind die Optionen für jedes Objekt dieselben?

Wenn ja dann bau dir nen Dialog mit den Optionen und öffne diesen dann wenn ein Objekt initialisiert, oder erneut ausgewählt wird(dafür vielleicht einen Button "Properties", da es sonst nervig wird wenn man ma nicht gleich das Objekt der Begierde trifft).

Zu 2. Ich würde die Objekte in einer Collection speichern(Generic?) und die Optionen in den Objekten natürlich.
 
Wie du es dar stellst musst du entscheiden. Solange es benutzerfreundlich bleibt.
Ich stell mir das vor wie der klassische PropertyEditor wie man ihn aus Eclipse oder Netbeans kennt.

Ich nehme an du willst die Objekte persistent speichern in einem File oder Datenbank.

Wenn das Object angezeigt werden soll wird es geladen, beim Bestätigen wird es gespeichert und beim schließen (falls es das gibt, löschst du die Refenz und der GC räumt es auf)

Soll immer nur ein oder mehre PropertyEditor Fenster geöffnet werden können? Wenn du nur eins anzeigen willst kannst du eigentlich nur das Model(Objekt) austauschen aber die GUI Komponente bleibt dieselbe.
 
So hier habe ich mal einen Code zurecht geschrieben 😉 Kannst ja reingucken, wenn du nicht mehr weiterkommst 😀

Du könntest noch hinzufügen, dass er die Objekt-Eigenschaften in eine Datei schreibt und wieder beim richtigen Zeitpunkt einliest.
Aber wenn die Speicherung der Objekte nur während der Laufzeit sein soll, reicht das hier vollkommen aus.

EDIT: Wozu Methoden? Copy&Paste geht genau so schnell :lol:

Java:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;



public class ObjektSpeicherung extends JFrame implements ActionListener {
    
    private Container c;
    private TitledBorder Border1, Border2;
    
    // ComboBox
    private JComboBox combobox;
    private String[] objekte = { "Objekt 1", "Objekt 2", "Objekt 3", "Objekt 4" };
    
    // Für jedes "String[] objekte" ein Objekt
    private Objekte Objekt1, Objekt2, Objekt3, Objekt4;
    
    private int selected = -1;
    
    private JButton properties;
    private JCheckBox checkbox, checkbox2;
    private JLabel label;
    private JTextField text;
    
    // Standard-Werte
    private static boolean wert_checkbox = false;
    private static boolean wert_checkbox2 = false;
    private static String wert_text = "";
    
    
    
    public ObjektSpeicherung() {
    JFrame fenster = new JFrame("WindowName");
    fenster.setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    c = fenster.getContentPane();
    c.setLayout(new BorderLayout());
   
    // Oberer Teil des Fensters 
    combobox = new JComboBox(objekte);
    combobox.addActionListener(this);
    combobox.setSelectedIndex(0);
    c.add(combobox, BorderLayout.NORTH);
    
    Border1 = new TitledBorder("Objects");
    Border1.setTitleFont(new Font(Font.DIALOG, Font.PLAIN, 14));
    Border1.setTitleColor(Color.blue);
    combobox.setBorder(Border1);
    
    
    // Unterer Teil des Fensters 
    
    properties = new JButton("Confirm");
    properties.addActionListener(this);
    properties.setBounds(120,300,100,30);
    
    checkbox = new JCheckBox("Option_a");
    checkbox.setBounds(20, 30, 100, 20);
    
    checkbox2 = new JCheckBox("Option_b");
    checkbox2.setBounds(20, 55, 100, 20);
    
    
    label = new JLabel("property_size");
    label.setBounds(25,90,100,20);
    text = new JTextField();
    text.setBounds(25, 115, 190,23);
    text.addKeyListener(new KeyAdapter() {
                public void keyTyped(KeyEvent e) {
                  char c = e.getKeyChar();
                  
                  // Nur Zahleneingabe erlauben und nur ein Komma
                  if (!((Character.isDigit(c) ||
                     (c == KeyEvent.VK_BACK_SPACE) ||
                     (c == KeyEvent.VK_DELETE) || (c == KeyEvent.VK_COMMA)))) {
                       getToolkit().beep();
                       e.consume();
                  } else if (c == KeyEvent.VK_COMMA) {
                      if (text.getText().indexOf(",") != -1) {
                        getToolkit().beep();
                        e.consume();       
                       } 
                  }
                  
                }
              });
    
    
   
    
    
    Border2 = new TitledBorder("Properties");
    Border2.setTitleFont(new Font(Font.DIALOG, Font.PLAIN, 14));
    Border2.setTitleColor(Color.blue);
    
    
    
    
    JPanel unten = new JPanel();
    unten.setLayout(null);
    unten.add(checkbox);
    unten.add(checkbox2);
    unten.add(label);
    unten.add(text);
    unten.add(properties); 
    unten.setBorder(Border2);
    c.add(unten, BorderLayout.CENTER);
         
    
    
    fenster.setSize(250,425);
    fenster.setLocationRelativeTo(null);
    fenster.setResizable(false);
    fenster.setVisible(true);
    
    
    }
    
    public void actionPerformed(ActionEvent e) {
        
    Object action = e.getSource();
    
    if (action == combobox){
        
        if(combobox.getSelectedIndex() != selected) {
        System.out.println("Selected: " + (combobox.getSelectedIndex()+1));
        
        if((combobox.getSelectedIndex() + 1) == 1) {
            if (Objekt1 != null) {
                checkbox.setSelected(Objekt1.getOption_a());
                checkbox2.setSelected(Objekt1.getOption_b());
                text.setText("" + Objekt1.getProperty_size());
            } else {
                
                if(checkbox != null && checkbox2 != null && text != null ) {
                checkbox.setSelected(wert_checkbox);
                checkbox2.setSelected(wert_checkbox2);
                text.setText(wert_text);
                }
              
            }
        } 
        if((combobox.getSelectedIndex() + 1) == 2) {
            if (Objekt2 != null) {
                checkbox.setSelected(Objekt2.getOption_a());
                checkbox2.setSelected(Objekt2.getOption_b());
                text.setText("" + Objekt2.getProperty_size());
            } else {
                
                if(checkbox != null && checkbox2 != null && text != null ) {
                checkbox.setSelected(wert_checkbox);
                checkbox2.setSelected(wert_checkbox2);
                text.setText(wert_text);
                }
              
            }
        } 
        if((combobox.getSelectedIndex() + 1) == 3) {
            if (Objekt3 != null) {
                checkbox.setSelected(Objekt3.getOption_a());
                checkbox2.setSelected(Objekt3.getOption_b());
                text.setText("" + Objekt3.getProperty_size());
            } else {
                
                if(checkbox != null && checkbox2 != null && text != null ) {
                checkbox.setSelected(wert_checkbox);
                checkbox2.setSelected(wert_checkbox2);
                text.setText(wert_text);
                }
              
            }
        } 
        if((combobox.getSelectedIndex() + 1) == 4) {
            if (Objekt4 != null) {
                checkbox.setSelected(Objekt4.getOption_a());
                checkbox2.setSelected(Objekt4.getOption_b());
                text.setText("" + Objekt4.getProperty_size());
            } else {
                
                if(checkbox != null && checkbox2 != null && text != null ) {
                checkbox.setSelected(wert_checkbox);
                checkbox2.setSelected(wert_checkbox2);
                text.setText(wert_text);
                }
              
            }
        } 
        
        selected = (combobox.getSelectedIndex());
        
        }
    }
    if (action == properties) {
        String Item = combobox.getSelectedItem().toString();
        if(combobox.getSelectedItem().toString() == objekte[0]) {
           // System.out.println("Obejekt 1");
            if( Objekt1 == null){
            Objekt1 = new Objekte();
            }
            Objekt1.aendereOption_a(checkbox.isSelected());
            Objekt1.aendereOption_b(checkbox2.isSelected());
            Objekt1.aendereProperty_size( Double.valueOf(text.getText().replace(',', '.')).doubleValue());
            Objekt1.getInfo();
        }
        if(combobox.getSelectedItem().toString() == objekte[1]) {
            //System.out.println("Obejekt 2");
            if( Objekt2 == null){
            Objekt2 = new Objekte();
            }
            
            Objekt2.aendereOption_a(checkbox.isSelected());
            Objekt2.aendereOption_b(checkbox2.isSelected());
            Objekt2.aendereProperty_size( Double.valueOf(text.getText().replace(',', '.')).doubleValue());
            Objekt2.getInfo();
        }
        if(combobox.getSelectedItem().toString() == objekte[2]) {
            //System.out.println("Obejekt 3");
            if( Objekt3 == null){
            Objekt3 = new Objekte();
            }
            
            Objekt3.aendereOption_a(checkbox.isSelected());
            Objekt3.aendereOption_b(checkbox2.isSelected());
            Objekt3.aendereProperty_size( Double.valueOf(text.getText().replace(',', '.')).doubleValue());
            Objekt3.getInfo();
        }
        if(combobox.getSelectedItem().toString() == objekte[3]) {
           // System.out.println("Obejekt 4");
            if( Objekt4 == null){
            Objekt4 = new Objekte();
            }
            
            Objekt4.aendereOption_a(checkbox.isSelected());
            Objekt4.aendereOption_b(checkbox2.isSelected());
            Objekt4.aendereProperty_size( Double.valueOf(text.getText().replace(',', '.')).doubleValue());
            Objekt4.getInfo();
        }
        
    }
    }
    
    
    
    private class Objekte {
    // Eigenschaften der Objekte mit deren Standardwerten
    private boolean Option_a = false;
    private boolean Option_b = false;
    private double  property_size = 0;
    
    
    // Setter-Methoden 
    public void aendereOption_a(boolean zustand) {
    Option_a = zustand;    
    }
    public void aendereOption_b(boolean zustand) {
    Option_b = zustand;    
    }
    public void aendereProperty_size(double size) {
    property_size = size;    
    }    
    
    // Getter-Methoden
    public boolean getOption_a() {
        return Option_a;
    }
    public boolean getOption_b() {
        return Option_b;
    }
    public double getProperty_size() {
        return property_size;
    }
    
    
    
    public void getInfo() {
        System.out.println("Option_a: " + checkbox.isSelected() + "\n" +
                           "Option_b: " + checkbox2.isSelected() + "\n" + 
                           "property_size: " + property_size);
    }       
        
}
    public static void main(String[] args) {
        new ObjektSpeicherung();
    }
}
 
Zuletzt bearbeitet:

Zurück
Oben