I need to take in customizable actions read from a file and bind them to a key for a program.
If I have a file like so:
w:up
s:down
a:left
d:right
How would I go about getting this running?
The only way I see it is doing this:
// hardcoded String to Action to turn "up" into an actual instruction
HashMap<String, Action> actions = new HashMap<String, Action();
actions.put("up", new Up());
actions.put("down", new Down()); // etc.
HashMap<Integer, Action> keybindings = new HashMap<Integer, Action>();
while (!endOfFile) {
int key = letterToKeycode(getKey()); // gets keycode for letter
Action action = actions.get(getCommand());
keybindings.put(key, action);
endOfFile = isEndOfFile();
}
Then when my keylistener method gets called, it does:
public void keyPressed(int keycode) {
keybindings.get(keycode).doAction();
}
and doAction() would be in each Action class. So if I had Up(), it would call person.moveUp().
If I was to rebind most of my keys, it could result in hundreds of classes that are a few lines long.
There’s something about the above concept, and a single switch statement that makes me want to avoid them. Is there “cleaner” trick to doing this?
As an example of what I mean, Eclipse has keybindings you can set in the preferences, so when you hit a key, it fires off an event and interprets what the key is supposed to do based on those settings. I’m attempting to do this.
Rather than create your own
Map, use Key Bindings;LinePanelis an example. You may be able to parameterize or re-factor yourActionimplementation(s) to mitigate proliferation. To persist user-defined key assignments, you may be able to adapt the approach used in the example cited here.