Использование действия для обновления переменной экземпляра в другом классе - PullRequest
0 голосов
/ 19 марта 2019

Поэтому я пытаюсь использовать привязки клавиш, а метод put () карты действий принимает действие и строковый параметр.

/* all declartion is above
     * the class extends JPanel so the keyword "this" can be used
     * xlist is an ArrayList of Integers
     * keyActionRight ka = new keyActionRight(x); is declared above, where x is a global int
     * this is part of the keyBindingsTest class */

    xlist.add(x); 
    im = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "right");

    am = this.getActionMap();
    am.put("right", ka);
    System.out.println(ka.getNextX(xlist)); //Any way for this to be called just like if I printed in the actionPerformed of the action class?

Это класс keyActionRight.Это действие, когда вы получаете действие при расширении AbstractAction:

public class keyActionRight extends 
AbstractAction
{
    private int x; 
    private ArrayList<Integer> xlist;
    public keyActionRight(int x)
    {
        this.x = x;
        xlist = new ArrayList<Integer>(); 
        xlist.add(x);  
    }

    public int getNextX(ArrayList<Integer> x)
    {
        x = xlist; 
        return x.get(0);
    }

    public void actionPerformed(ActionEvent e)
    {
        if(x != 440)
        {
            x++; //this incrementing works fine
            xlist.add(0, x); //this updates xlist fine
        }  
    }
}

По сути, цель состоит в том, чтобы просто обновить переменную экземпляра x в классе keyBindingsTest всякий раз, когда я нажимаю или удерживаю клавишу со стрелкой вправо.X в классе Action обновляется очень хорошо, когда я делаю это (я распечатал его, и он работает).Было указано, почему он не обновляется - он вызывается только один раз в операторе print.Я хочу знать, есть ли способ заставить эту работу с отдельным классом для действия или мне нужно выбрать другой подход.

Я мог бы попытаться выполнить действие в классе keyBindingsTest, но в прошлый раз, когда я пытался это сделать, я получал странные ошибки.Любая помощь будет оценена.

Спасибо.

1 Ответ

1 голос
/ 19 марта 2019

У вас ошибочные предположения:

xlist.add(x); 
im = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "right");

am = this.getActionMap();
am.put("right", ka);

// **** the comment below is incorrect ****
//only prints out zero - should print out ascending values of x as I hold down the right arrow key
System.out.println(ka.getNextX(xlist));  

Предположение, которое вы делаете, заключается в том, что println вызывается при вызове действия Key Bindings, но это просто не так.Println называется один раз и только один раз , когда привязка ключа создана .Единственный код, который вызывается повторно, - это код внутри метода ActionPerformed, который вызывается в ответ на событие.

Если вы хотите, чтобы код вызывался несколько раз и в ответ на событие, он долженПоместить в прослушиватель событий, а не код создания прослушивателя.

...