Idea jest bardzo prosta. http://pl.wikipedia.org/wiki/Podw%C3%B3jne_buforowanie
W przypadku obiektów Swinga nie trzeba nic robić ponieważ tam takie buforowanie jest już obecne i jest przezroczyste dla programisty (paintComponent dostaje kontekst graficzny do właściwego bufora).
Co do tutoriala, to aż się prosi o google. ;)
Co do drugiego pytania, to nie za bardzo go rozumiem. runMenu zakończy się jak skonstruuje wszystko co miał zrobić, wtedy wróci do kodu kontruktora, który też się zakończy. Okno po utworzeniu zacznie być zarządzane przez kolejkę zdarzeń Swinga. Jeżeli w runMenu zostaną zarejestrowane jakieś listenery, to odpowiednie procedury obsługi zostaną wywołane gdy nadejdą obsługiwane przez nie zdarzenia. Co do runApp, to powinna być ona procedurą obsługi zdarzenia dla wybrania z menu pierwszej pozycji (zaimplementowaną metodą interfejsu). Aby ją zarejestrować należy użyć w np. runMenu jakiegoś listenera, który utworzy obiekt np. klasy anonimowej, implementującego konkretny interfejs listenera (najczęściej jest to tylko jedna metoda do zaimplementowania).
ps. Metoda addKeyListener służy do dodania procedury obsługi wciśnięcia klawisza. Po wciśnięciu Enter wywoływana jest metoda obiektu, który podano jako argument w addKeyListener, a nie "w metodzie addKeyListener".
Listenery tworzy się najczęściej jako anonimowe klasy wewnętrzne w klasie reprezentującej element GUI, który generuje konkretne zdarzenia. Dzięki temu zarówno konstrukcja jak i obsługa działania konkretnego obiektu są w tym samym miejscu.
Pytania i nazwy metod sugerują, że nie załapałeś jeszcze, że to nie ty wywołujesz kod GUI, ale kod GUI (obiektów Swinga) wywołuje Twój kod. Twoim zadaniem jest jedynie podawanie mu obiektów, którymi będzie zarządzał (przez metody takie jak createGUI wywołujące metody add oraz setVisible) oraz obiektów, których metody będą reagowały na zdarzenia z tych obiektów (przez dodawanie/usuwanie listenerów).