private void rebuild() {
        removeAll();
        setLayout(new GridLayout(0, 1));
        JButton addSpellBookButton = new JButton("Add New Spellbook");
        addSpellBookButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFrame newSpellBookFrame = createSpellbookFrame();
                newSpellBookFrame.setVisible(true);
                updateParent();
            }
        });
        for (Map.Entry<String, SpellBook> entry : spellBooks.entrySet()) {
            final String key = entry.getKey();
            final SpellBook value = entry.getValue();
            final JPanel spellsPerDayPanel = new JPanel(new GridLayout(0, 1));
            final JPanel spellsPerDayTable = new JPanel(new GridLayout(0, 2));
            final JPanel preparedSpellsPanel;
            final JPanel domainSpellsPanel;
            final JPanel specialtySchoolPanel;
            final JPanel spellFailureFieldPanel;
            final JButton deleteSpellBookButton = new JButton("Delete Above Spellbook");
            deleteSpellBookButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    spellBooks.remove(key);
                    updateParent();
                }
            });
            add(new JLabel(key));
            for (int i = 0; i < 10; i++) {
                final int n = i;
                spellsPerDayTable.add(new JLabel(Integer.toString(i)));
                final JTextField spellsPerDayNumber = new JTextField();
                spellsPerDayNumber.addFocusListener(new FocusListener() {
                    @Override
                    public void focusGained(FocusEvent e) {
                        //nothing
                    }

                    @Override
                    public void focusLost(FocusEvent e) {
                        value.setSpellsPerDay(n, Integer.parseInt(spellsPerDayNumber.getText()));
                    }
                });
                spellsPerDayTable.add(spellsPerDayNumber);
                final JButton seeListButton = new JButton("See List");
                seeListButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JPanel spellBookDialogBox = createSpellDialogBox();
                        updateParent();
                    }
                });
            }
            spellsPerDayPanel.add(new JLabel("Spells Known"));
            spellsPerDayPanel.add(spellsPerDayTable);
            add(spellsPerDayPanel);
            if (value.hasPreparedSpells()) {
                preparedSpellsPanel = new JPanel(new VerticalLayout());
                JPanel preparedSpellsTablePanel = new JPanel(new GridLayout(10, 4));
                for (int i = 0; i < 10; i++) {
                    final int n = i;
                    spellsPerDayTable.add(new JLabel(Integer.toString(n)));
                }
                preparedSpellsPanel.add(preparedSpellsTablePanel);
                add(preparedSpellsPanel);
            }
            if (value.hasDomains()) {
                domainSpellsPanel = new JPanel(new GridLayout(0, 10));
                //@TODO create domain panel
                add(domainSpellsPanel);
            }
            if (value.hasSpecialtySchools()) {
                specialtySchoolPanel = new JPanel(new GridLayout(0, 10));
                //@TODO create specialty panel
                add(specialtySchoolPanel);
            }
            if (value.hasSpellFailure()) {
                spellFailureFieldPanel = new JPanel(new GridLayout(0, 10));
                //@TODO create spell failure panel
                add(spellFailureFieldPanel);
            }
            add(deleteSpellBookButton);
        }
        add(addSpellBookButton);
    }