2012-08-27 79 views
3

隱藏後,我可以在按鈕上調用doClick
喜歡:doClick點擊隱形按鈕

StopBtn.setVisible(false); 
StopBtn.doClick(); 

doClick()還是做的工作?

+5

我覺得這是那些情況下,最好是嘗試一下自己,看看會發生什麼情況之一的actionPerformed方法。 – mrranstrom

回答

3

我剛剛爲你嘗試過。它仍然有效,這意味着它仍然會觸發actionPerformed()方法。

但是,如果您禁用它,則不起作用:button.setEnabled(false)這是有道理的。

+0

謝謝Dan爲我嘗試。是的,當它被禁用時它沒有做任何事情是有道理的,但如果即使按鈕不可見,doClick仍然可以工作,這很奇怪。 – SomeDude

3

發現,這是當然的,只是測試它(例如,在一個單元測試,如果你擔心甲骨文那些傢伙將永遠改變行爲)

@Test 
public void clickOnInvisibleButton(){ 
    JButton button = new JButton("test button"); 
    button.setVisible(false); 
    final boolean[] buttonClicked = new boolean[]{false}; 
    button.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     buttonClicked[0] = true; 
    } 
    }); 
    button.doClick(); 
    assertTrue("Button has not been clicked", buttonClicked[0]); 
} 

否則最簡單的方法,你可以採取一個看看該方法的源代碼

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方法中),您會發現enabled狀態的檢查,但清楚地看到沒有檢查存在的可見性。你也看到了ActionEvent被激發,這將觸發按鈕

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(); 
}