使用动作来更新另一个类中的实例变量

时间:2019-03-19 00:21:49

标签: java swing action key-bindings

因此,我尝试使用“键绑定”,并且操作映射的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
        }  
    }
}

本质上,目标是每当我按住右箭头键时,更新keyBindingsTest类中的实例变量x。执行此操作时,Action类中的x可以很好地更新(我将其打印出来并且可以工作)。有人指出了为什么不更新-在print语句中只调用一次。我想知道是否有一种方法可以通过单独的类来完成此操作,或者是否需要采用其他方法。

我可以尝试在keyBindingsTest类中进行操作,但这在我上次尝试时给了我奇怪的错误。任何帮助,将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

您有错误的假设:

$

您所做的假设是,在调用“键绑定”操作时会调用println,但事实并非如此。当创建键绑定 时,println被称为一次,并且仅被称为一次。唯一被重复调用的代码是Action的actionPerformed方法中的代码,该代码是响应事件而调用的。

如果您想多次调用代码并响应事件,则必须将其放置在事件监听器中,而不是监听器的创建代码中。