Swing 点击一个不可见的按钮

Swing 点击一个不可见的按钮,swing,jbutton,actionlistener,Swing,Jbutton,Actionlistener,在使按钮不可见后,我可以在按钮上调用doClick。 比如: doClick()还能用吗?我刚刚为您试用过。它仍然有效,这意味着它仍然会触发actionPerformed()方法 但是,如果您禁用它,它将不起作用:按钮。setEnabled(false),这是有意义的。发现这一点的最简单方法当然是测试它(例如,在单元测试中,如果您担心Oracle的人员会改变行为) 否则,您可以查看该方法的源代码 public void doClick(int pressTime) { Dimension

在使按钮不可见后,我可以在按钮上调用
doClick

比如:


doClick()
还能用吗?

我刚刚为您试用过。它仍然有效,这意味着它仍然会触发
actionPerformed()
方法


但是,如果您禁用它,它将不起作用:
按钮。setEnabled(false)
,这是有意义的。

发现这一点的最简单方法当然是测试它(例如,在单元测试中,如果您担心Oracle的人员会改变行为)

否则,您可以查看该方法的源代码

public void doClick(int pressTime) {
    Dimension size = getSize();
    model.setArmed(true);
    model.setPressed(true);
    paintImmediately(new Rectangle(0,0, size.width, size.height));
    try {
        Thread.currentThread().sleep(pressTime);
    } catch(InterruptedException ie) {
    }
    model.setPressed(false);
    model.setArmed(false);
}
在那里,您找不到对可见性的检查。再看远一点(例如,在模型的
setPressed
方法中),您会发现对
启用状态的检查,但可以清楚地看到,没有对存在的可见性进行检查。您还可以看到触发了
ActionEvent
,这将触发按钮的
actionPerformed
方法

public void setPressed(boolean b) {
    if((isPressed() == b) || !isEnabled()) {
        return;
    }

    if (b) {
        stateMask |= PRESSED;
    } else {
        stateMask &= ~PRESSED;
    }

    if(!isPressed() && isArmed()) {
        int modifiers = 0;
        AWTEvent currentEvent = EventQueue.getCurrentEvent();
        if (currentEvent instanceof InputEvent) {
            modifiers = ((InputEvent)currentEvent).getModifiers();
        } else if (currentEvent instanceof ActionEvent) {
            modifiers = ((ActionEvent)currentEvent).getModifiers();
        }
        fireActionPerformed(
            new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
                            getActionCommand(),
                            EventQueue.getMostRecentEventTime(),
                            modifiers));
    }

    fireStateChanged();
}

我认为这是最好自己尝试一下的例子之一,看看会发生什么。谢谢Dan为我尝试。是的,当它被禁用时不做任何事情是有意义的。但如果doClick()仍然可以工作,即使按钮不可见,那就很奇怪了。
public void doClick(int pressTime) {
    Dimension size = getSize();
    model.setArmed(true);
    model.setPressed(true);
    paintImmediately(new Rectangle(0,0, size.width, size.height));
    try {
        Thread.currentThread().sleep(pressTime);
    } catch(InterruptedException ie) {
    }
    model.setPressed(false);
    model.setArmed(false);
}
public void setPressed(boolean b) {
    if((isPressed() == b) || !isEnabled()) {
        return;
    }

    if (b) {
        stateMask |= PRESSED;
    } else {
        stateMask &= ~PRESSED;
    }

    if(!isPressed() && isArmed()) {
        int modifiers = 0;
        AWTEvent currentEvent = EventQueue.getCurrentEvent();
        if (currentEvent instanceof InputEvent) {
            modifiers = ((InputEvent)currentEvent).getModifiers();
        } else if (currentEvent instanceof ActionEvent) {
            modifiers = ((ActionEvent)currentEvent).getModifiers();
        }
        fireActionPerformed(
            new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
                            getActionCommand(),
                            EventQueue.getMostRecentEventTime(),
                            modifiers));
    }

    fireStateChanged();
}