0

通过使 addButton 返回一个布尔值(单击时为真,未单击时为假)来解决方法,然后我这样做了:if (addButton) { doSomething(); }

(抱歉,标题可能会产生误导。无法编造更好的标题)

我得到了这个方法(我们称之为method1,它在循环中也一直被调用),它添加了一个自定义按钮,我希望那个按钮(当点击时)只运行一次指定的方法(让我们称之为method2)。我希望在几个不同的类中使用 method1,但要触发不同的操作。

public void addButton(Graphics2D g2d, int x, int y, AttributedCharacterIterator atstr, Method method)
{
    BufferedImage img = Sprites.button;

    x -=img.getWidth()/2;
    y -=img.getHeight()/2;
    int border = 10;

    g2d.drawImage(img, null, x, y);
    g2d.drawString(atstr, x + (img.getWidth()/2) - border, y + (img.getHeight()/2) + 10);
    Rectangle getBounds = new Rectangle(x, y, img.getWidth(), img.getHeight());
    if (MouseInput.getBounds().intersects(getBounds) && MouseInput.mouseClickedPressed == true)
    {
        try {
            method.invoke(this);
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

它是这样调用的:

addButton(g2d, 200, 200, Template.atstr(g2d, "Siege!", Color.BLACK, "Times New Roman", 20, doSomething()));
        public Method doSomething()
        {
            //Action.....
            return null;
        }

我的问题是method2一直被调用,我已经知道为什么了,但是有什么办法吗?

4

3 回答 3

0

如果你希望它只被调用一次,你需要在第一次调用时boolean invoked设置为的标志/字段true,并防止以后被调用——只要写一些如果:if(!invoked) { invoke... }

于 2013-03-23T17:46:14.657 回答
0

我试图理解您的代码但失败了......但是我相信我可以建议您创建特殊标志(例如buttonClicked)。这个变量的值将是false

当用户单击按钮时,流程应到达如下代码:

if (buttonClicked) {
    return;
}
buttonClicked = true;
// do other stuff hrere

请不要忘记同步这段代码。否则,如果用户点击速度足够快,它可以同时执行。

于 2013-03-23T17:46:15.780 回答
0

基本上你需要一个标志变量,它是在方法 2 运行时设置的。检查方法2if(!flag) method2();

于 2013-03-23T17:46:30.057 回答