【问题标题】:Reason for calling setEnabled(false) in JPanel在 JPanel 中调用 setEnabled(false) 的原因
【发布时间】:2012-04-01 14:21:00
【问题描述】:

我现在在 Swing 上工作了一段时间,但在实践中我从来没有遇到过不得不在 JPanel 中调用 setEnabled(false) 的情况。 不过,我有时会在一些复杂的 gui 中看到这样的代码。但我真的不明白为什么有人要使用它? 所以,当你需要在JPanel上使用setEnabled(false)时,请给我一些现实生活中常见情况的例子。

在 javadoc 中它还说:

禁用组件不会禁用其子组件。

实际上我有一个错误,因为禁用JPanel 内的表格在调整列大小时没有显示鼠标调整大小光标。我怀疑这里还有其他令人不快的意外。

【问题讨论】:

  • 我相信您可以通过这种方式禁用顶级窗口,但不能禁用容器
  • @Hovercraft Full Of Eels:JPanel 仍然有这样的方法。对我来说,这看起来像是完全无用的潜在错误来源。但也许我弄错了,它对 JPanel 有一些实际用途。
  • 使用秋千就像千刀万剐。什么都不做的方法?真的吗?

标签: java swing jpanel


【解决方案1】:

一个原因是 getEnabled() 将反映正确的状态。 考虑某个事件处理程序想要标记面板的情况 因为不再启用​​,并且在事件发生时不谨慎 迭代并禁用所有子组件。其他部分 应用程序可能需要通过 getEnabled() 测试面板的状态以 确定在应用程序的不同点做什么。

我个人从来不需要这样做,但现在你问了我并得到了我 我想我可能会在某个时候使用它。谢谢。 &&+=1 回答问题。

【讨论】:

  • 我想如果你禁用所有孩子,这是一个有效的用法。否则,它可能会导致类似于我的问题中描述的错误。顺便说一句,很好的例子。可惜 Swing 无法在一行代码中禁用组件的所有子组件。
  • utils 类中的 setEnabledAll() 会很简单。我会添加一个以防有人需要看看它是如何完成的。
  • 如果没有相关的期望行为,简单的状态标志就没有多大价值。您的setEnabledAll() 似乎是对 JPanel 的明显扩展(或更一般地,对任何视图元素,如组件)。我一直在 Swing 中找到这样的挠头。
【解决方案2】:

用于启用/禁用容器中所有组件的起始代码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 2019-04-25
    • 2013-04-12
    • 1970-01-01
    • 2012-08-25
    • 2019-12-21
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多