Как сделать TextField в JSpinner недоступным для редактирования, чтобы пользователь мог использовать только кнопки вверх и вниз? - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь сделать TextField для моего JSpinner недоступным для редактирования в сетевых компонентах, чтобы пользователь мог использовать только кнопки вверх и вниз для изменения значения int в текстовом поле JSpinner, как я могу это сделать?альтернативой для меня было бы разрешить вводить только значения типа int в поле, а не двойные значения, прямо сейчас, если пользовательский ввод равен 21,5, тогда к этому определенному «Elevhem» в базе данных добавляется 215 точек.

(имя моего JSpinner - antalPoang)

if (Validering.isPositivtSpinner(antalPoang)) {
            try {
                String elevhemsNamn = (String) namnElevhem.getSelectedItem();
                int points = (int) antalPoang.getValue();
                String query = "UPDATE ELEVHEM SET HUSPOANG = HUSPOANG + " + points + " WHERE ELEVHEMSNAMN ='" + elevhemsNamn +"'";

                if (namnElevhem.getSelectedItem().equals("Gryffindor")) {
                    db.update(query);
                    ImageIcon icon = new ImageIcon("Gryffindor.png");
                    JOptionPane.showMessageDialog(null, "Poängen har lagts till", " ", JOptionPane.INFORMATION_MESSAGE, icon);
                    antalPoang.setValue(0);



                } else if (namnElevhem.getSelectedItem().equals("Ravenclaw")) {
                    db.update(query);
                    ImageIcon icon = new ImageIcon("Ravenclaw.png");
                    JOptionPane.showMessageDialog(null, "Poängen har lagts till", " ", JOptionPane.INFORMATION_MESSAGE, icon);
                    antalPoang.setValue(0);

                } else if (namnElevhem.getSelectedItem().equals("Slytherin")) {
                    db.update(query);
                    ImageIcon icon = new ImageIcon("Slytherin.png");
                    JOptionPane.showMessageDialog(null, "Poängen har lagts till", " ", JOptionPane.INFORMATION_MESSAGE, icon);
                    antalPoang.setValue(0);

                } else if (namnElevhem.getSelectedItem().equals("Hufflepuff")) {
                    db.update(query);
                    ImageIcon icon = new ImageIcon("Hufflepuff.png");
                    JOptionPane.showMessageDialog(null, "Poängen har lagts till", " ", JOptionPane.INFORMATION_MESSAGE, icon);
                    antalPoang.setValue(0);
                }

            } catch (InfException e) {
                JOptionPane.showMessageDialog(null, "Något blev fel");
            }
        }

1 Ответ

0 голосов
/ 31 декабря 2018

Я реализовал что-то по аналогии с ползунком, используя 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
    }
}
...