To quote the Java Documentation:
"Key typed" events are higher-level and generally do not depend on the
platform or keyboard layout. They are generated when a Unicode
character is entered, and are the preferred way to find out about
character input. In the simplest case, a key typed event is produced
by a single key press (e.g., 'a'). Often, however, characters are
produced by series of key presses (e.g., SHIFT + 'a'), and the mapping
from key pressed events to key typed events may be many-to-one or
many-to-many. Key releases are not usually necessary to generate a key
typed event, but there are some cases where the key typed event is not
generated until a key is released (e.g., entering ASCII sequences via
the Alt-Numpad method in Windows). No key typed events are generated
for keys that don't generate Unicode characters (e.g., action keys,
modifier keys, etc.).
The char variable always contains a valid Unicode character or
CHAR_UNDEFINED. Character input is reported by key typed events; key
pressed and key released events are not necessarily associated with
character input. Therefore, the char variable is guaranteed to be
meaningful only for key typed events.
For key pressed and key released events, the code variable contains
the event's key code. For key typed events, the code variable always
contains KeyCode.UNDEFINED.
"Key pressed" and "key released" events are lower-level and depend on
the platform and keyboard layout. They are generated whenever a key is
pressed or released, and are the only way to find out about keys that
don't generate character input (e.g., action keys, modifier keys,
etc.). The key being pressed or released is indicated by the code
variable, which contains a virtual key code.
Basically said, "Key typed" events are input events while "Key pressed" and "Key released" events are keyboard events.