Die Registerkarte in JTabbedPane spiegelt keine Änderungen beim Drücken von Schaltflächen wider

Auf einer Registerkarte meiner Benutzeroberfläche kann der Benutzer den Namen eines Mitarbeiters bearbeiten. Der Name dient auch als Bezeichnung für die Registerkarte. Wenn die Änderung bestätigt wird, sollte die Registerkarte aktualisiert werden, um diese Änderung widerzuspiegeln, und die neuen Daten werden in eine Datendatei geschrieben.

Die Mitarbeiter sind in einerHashMap in der KlasseEmployees. Die Registerkarten werden durch Iteration durch ein gefülltArrayList<String> von Mitarbeiternamen, die aus dem Aufruf der Methode erhalten wirdEmployees.getNames(). Über die GUI kann der Benutzer einen neuen Namen eingeben und dann die Schaltfläche zum Ändern des Namens drücken. Die KnöpfeActionListener ruft die Methode aufchangeName(), der den alten Namen durch den neuen Namen in der ersetztHashMap und aktualisiert die Datendatei.

Dies funktioniert korrekt, wenn ein Benutzer zum ersten Mal den Namen des Mitarbeiters ändern möchte, aber nachfolgende Änderungen führen zu einem Fehler. Es scheint, dass dieJPanel welches das enthältJTextFields (sehengetEmployeeInfoPanel() unten) aktualisiert den Parameter nichtname. Dieser Parameter ist der aktuelle Name des Mitarbeiters, während der neue Name aus dem übernommen wirdJTextField.

Ein Beispiel zur Veranschaulichung dieses Problems finden Sie unten. Im Wesentlichen sind die Schritte:

1. old name = Mary is provided when the program starts
2. User changes name in JTextField, so oldName = Mary and newName = Mary S.
3. At this point, oldName should update to Mary S. as it is the new key.
   However, oldName remains as Mary so the HashMap cannot be  updated again.

Die Hierarchie dieses Bildschirms lautet:

JFrame (entire application)
   |
    -- JPanel EmployeesPanel (this screen)
   |     |
   |      -- JPanel (for custom menu bar)
   |     |
   |      -- JTabbedPane (one tab for each employee)
   |             |
   |              -- JPanel (contains JLabels, JTextField, etc for this employee)
   |
    -- .....

Und hier ist der relevante Code aus der GUI:

public class EmployeesPanel {
    private JTabbedPane pane;
    private Employees employees;
    ...
    public EmployeesPanel(JPanel panel, Container cards) {
        ...
        pane = new JTabbedPane();
        getEmployees();
    }

    private void getEmployees() {
                    ...
        employees = new Employees(properties, EMPLOYEES_TXT);
        //ArrayList of all employees' names
        names = employees.getNames();
        for(String name : names) {
            pane.addTab(name, getEmployeeInfoPanel(name));
        }
        pane.addTab("NEW EMPLOYEE", addEmployeePanel());
    }

    public JPanel addEmployeePanel() {
        ...
    }

    private JPanel getEmployeeInfoPanel(final String name) throws EmployeeException {
        JPanel infoPanel = new JPanel();
        infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.PAGE_AXIS));

        JLabel nameLabel = new JLabel("Employee name");
        JLabel wageLabel = new JLabel("Employee wage");
        final JTextField nameField = new JTextField(name, 30);
        final JTextField wageField = new JTextField(employees.getWage(name).toString(), 30);

        JButton changeNameButton = new JButton("CHANGE NAME");
        JButton changeWageButton = new JButton("CHANGE WAGE");

        changeNameButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                try {
                    String newName = nameField.getText();
                    employees.changeName(name, newName);
                    panel.validate();
                } catch (EmployeeException e) {
                    // TODO create popup warning
                }
            }
        });
        ...
        return infoPanel;
    }
}

Und hier ist der Code aus der Klasse Employees, der die HashMap ändert:

public void changeName(String oldName, String newName) throws EmployeeException {
    System.out.println("old name = " + oldName + ", new name = " + newName);
    if(employees.containsKey(oldName)) {
        BigDecimal wage = employees.get(oldName);
        employees.remove(oldName);
        employees.put(newName, wage);
        names.remove(oldName);
        names.add(newName);
        prop.remove(oldName);
        prop.setProperty(newName, wage.toString());
        saveProperties();
        System.out.println(names);
    } else {
        throw new EmployeeException("Could not change name because employee does not exist.");
    }
}

Hier ist ein Beispiel. Der erste Screenshot zeigt den Zeitpunkt, an dem das Programm gestartet wird. Die Mitarbeiternamen werden auf den entsprechenden Registerkarten angezeigt. Der zweite Screenshot zeigt den Versuch, den Namen des Mitarbeiters zu ändern. Wie Sie sehen, hat sich die Beschriftung der Registerkarte nicht geändert, für die ich den Aufruf angenommen habevalidate() würdest du.

(Vor)

(Nach dem Drücken der Taste)

Die Ausgabe, die zweimal auf die Schaltfläche zum Ändern des Namens drückt, zeigt, dass der Name in der ArrayList geändert wurde:

old name = Mary, new name = Mary S.
[Jane, Bob, Sue, Mary S.]
old name = Mary, new name = Mary S.
653647 [AWT-EventQueue-0] ERROR employees.EmployeeException - Could not change name because employee does not exist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage