2012-03-16 116 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); 
     } 
    } 
} 
相关问题