On screen buttons is just a matter of testing to see if a mouse click event occurred inside a rectangle. If buttons can overlap, you need to define a z-order of each button and activate the closest one only. Keyboard input may as well be done exactly how AWT/Swing does it. Make sure you understand the difference between keyPressed/keyReleased events and keyTyped events. They are defined in the same interface, but have very different purposes.
If you use event listeners do not confuse the callback method for the action it is supposed to trigger. Mixing game logic with UI logic creates a mess and means you have to rewrite lots of code if you want to keep the same functionality but map it to a different input or sequence of inputs.
It's absolutely a good idea to split up a basic listener interface with individual "events". [But] a lot of people make the mistake of doing things like creating a public save() method of their component class instead of a protected saveButtonPressed() and a public saveProject() method in another class.