Я реализовал что-то по аналогии с ползунком, используя JTextField, так как в моем случае это оставалось textField.Это может быть полезно для вас, хотя вам может потребоваться что-то более простое, чем Object[] obj
,
/**
*
* @param jTextField field to listen on
* @param minLimit minimum value for field
* @param maxLimit maximum value for field
* @param obj Generic object to return integer value
*/
public static void variableDragListener(JTextField jTextField, int minLimit, int maxLimit, Object[] obj,
Consumer<Object> setVarMethod) {
jTextField.addMouseMotionListener(new MouseMotionAdapter() {
int lastMouseX;
@Override
public void mouseDragged(MouseEvent mouse) {
if (mouse.getX() != lastMouseX) {
int step = mouse.getX() > lastMouseX ? 1 : -1;
if (obj instanceof Integer[]) {
acceptBoundedIntMethod(step, (Integer) obj[0], minLimit, maxLimit, setVarMethod);
}
lastMouseX = mouse.getX();
}
}
});
}
private static void acceptBoundedIntMethod(int step, Integer variable, int minLimit, int maxLimit,
Consumer<Object> setVarMethod) {
if (minLimit <= variable + step && maxLimit >= variable + step) {
setVarMethod.accept(variable + step);
}
}
Еще одна реализация, которая была у меня, была связывание клавиш на панели, которая поглощала большинство слушателей мыши / клавишных команд
/**
* Modified from
* /7623320/java-keylistener-ne-vyzyvaetsya
* <p>
* For a JPanel, set Key Bindings to execute consumer method on KeyBinding activation
*
* @param actionMap JPanel actionMap
* @param inputMap JPanel inputMap
* @param keyBindings UserDefined Key->Method binding
*/
public static void setKeyBindings(ActionMap actionMap, InputMap inputMap,
Map<Integer, Consumer<Object>> keyBindings) {
for (int keyCode : keyBindings.keySet()) {
String vkCode = KeyEvent.getKeyText(keyCode);
inputMap.put(KeyStroke.getKeyStroke(keyCode, 0), vkCode);
actionMap.put(vkCode, new KeyAction(vkCode, keyBindings.get(keyCode)));
}
}
/**
* Modified from
* /7623320/java-keylistener-ne-vyzyvaetsya
* <p>
* Action to execute consumer method when KeyBinding is activated
*/
public static class KeyAction extends AbstractAction {
private final Consumer<Object> method;
public KeyAction(String actionCommand, Consumer<Object> method) {
this.method = method;
putValue(ACTION_COMMAND_KEY, actionCommand);
}
@Override
public void actionPerformed(ActionEvent actionEvt) {
method.accept(new Object());
}
}
public class GraphicPanel extends JPanel {
private final Map<Integer, Consumer<Object>> keyBindings = new HashMap<>();
{
keyBindings.put(KeyEvent.VK_ENTER, this::submitGamepiece);
}
public GraphicPanel() {
setKeyBindings(getActionMap(), getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW), keyBindings);
}
private void submitGamepiece(Object o) {
...
// method stuff here
}
}