private void createGUIComponents() {
        CardTreeNode treeRoot = new CardTreeNode(Main.CARDS);

        cardsTree = new JTree(treeRoot);
        cardsTree.setRootVisible(false);
        cardsTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        cardsTree.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                lcv.setDirectory(
                        ((CardTreeNode) e.getPath().getLastPathComponent())
                        .getFile());
            }
        });

        cardsFound = new JLabel("Cards found: " + treeRoot.countFiles());
        cardsFound.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        cardsFound.setHorizontalAlignment(SwingConstants.CENTER);

        scv = new SmallCardsViewer(this);

        lcv = new LargeCardsViewer(this);
        lcv.setDirectory(Main.CARDS);

        back = new JButton("Back");
        back.setFocusable(false);
        back.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                scv.close();
                DeckCreator.this.dispose();
                parentFrame.setVisible(true);
            }
        });

        deckName = new JLabel("Deck: new");

        load = new JButton("Load");
        load.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (dfc.showOpenDialog(DeckCreator.this)
                        == JFileChooser.APPROVE_OPTION) {
                    File f = dfc.getSelectedFile();
                    Deck t = Deck.load(f);
                    if (t == null) {
                        JOptionPane.showMessageDialog(DeckCreator.this,
                                "Deck could not be loaded", Main.TITLE_SHORT,
                                JOptionPane.ERROR_MESSAGE);
                    } else {
                        deck = t;
                        deckName.setText("Deck: "
                                + Utilities.getName(f));
                        scv.refresh();
                        stats.refresh();
                    }
                }
            }
        });

        save = new JButton("Save");
        save.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (dfc.showSaveDialog(DeckCreator.this) == JFileChooser.APPROVE_OPTION) {
                    File f = dfc.getSelectedFile();
                    if (!"txt".equals(Utilities.getExtension(f))) {
                        f = new File(f.toString() + ".txt");
                    }
                    if (deck.save(f)) {
                        deckName.setText("Deck: "
                                + Utilities.getName(f));
                    } else {
                        JOptionPane.showMessageDialog(DeckCreator.this,
                                "Deck could not be saved", Main.TITLE_SHORT,
                                JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        });
        
        stats = new Stats(this);
    }