2012-03-16 36 views
7

我在Swing上工作了一段時間,但從未遇到過實際情況,因此我不得不在JPanel中致電setEnabled(false)。 不過,我有時會在某些複雜的gui中看到這樣的代碼。但我真的不明白爲什麼有人想使用它? 所以,當你需要在JPanel上使用setEnabled(false)時,請給我一些真實生活中常見情況的例子。在JPanel中調用setEnabled(false)的原因

而且在Javadoc它說:

禁用的組件不會禁用其子。

其實我有一個bug,因爲禁用JPanel時,表格在調整列大小時沒有顯示鼠標調整大小光標。我懷疑這裏還有其他不愉快的驚喜。

+0

我相信你可以禁用頂層窗口這種方式,但不是容器 – 2012-03-16 01:34:08

+0

@Hovercraft全部鰻魚:仍然有JPanel中這樣的方法。對我而言,這看起來像是完全無用的潛在錯誤。但也許我錯了,它有一些實用的JPanel。 – GrayR 2012-03-16 01:59:58

+0

與鞦韆一起工作就像從一千個削減的死亡。一種什麼都不做的方法?真? – gdbj 2017-04-22 21:58:05

回答

6

一個原因是,getEnabled()將反映正確的狀態。 考慮一些情況,其中一些事件處理程序想要將面板 標記爲不再啓用​​,並且在事件 迭代並禁用所有子組件時不審慎。 應用程序的其他部分可能需要通過getEnabled()來測試面板的狀態,以確定在應用程序的不同位置要執行的操作。

我個人從來沒有這樣做,但現在你問我,並得到我 認爲我可能有時使用這個。謝謝。 & & + = 1的問題。

+0

我想如果你禁用所有的孩子,這是一個有效的用法。否則,它可能會導致類似於我的問題中描述的錯誤。順便說一下很好的例子。很遺憾Swing沒有辦法在一行代碼中禁用組件的所有子代。 – GrayR 2012-03-16 02:42:51

+1

utils類中的setEnabledAll()會很容易。我會添加一個需要看到如何完成的人。 – Java42 2012-03-16 03:18:16

+0

簡單的狀態標誌在沒有關聯的期望行爲時沒有太多價值。你的'setEnabledAll()'似乎是對JPanel(或者更一般地說任何視圖元素,比如Component)的一個明顯的擴展。我一直在Swing中找到像這樣的頭部劃痕。 – gdbj 2017-04-22 22:03:05

5

啓動代碼啓用/禁用容器中的所有組件。

JPanel p = new JPanel(); 
p.setEnabled(state); 
setEnabledAll(p, state); 

public void setEnabledAll(Object object, boolean state) { 
    if (object instanceof Container) { 
     Container c = (Container)object; 
     Component[] components = c.getComponents(); 
     for (Component component : components) { 
      setEnabledAll(component, state); 
      component.setEnabled(state); 
     } 
    } 
    else { 
     if (object instanceof Component) { 
      Component component = (Component)object; 
      component.setEnabled(state); 
     } 
    } 
} 
相關問題