【问题标题】:Reset/remove a border in Swing在 Swing 中重置/删除边框
【发布时间】:2009-04-07 17:33:32
【问题描述】:

这是一个非常具体的编码问题:

我最近被要求在工作中维护一些老式的 Java Swing GUI 代码并遇到了这个问题:

我已将我自己的 InputVerifier 子类(称为 MyFilenameVerifier)附加到 JTextField(但它也可以是用于这些目的的任何 JComponent)。我重写了 verify() 方法,使其调用 super.verify(input)(其中输入是 verify() 的 JComponent 参数)。如果 super.verify(input) 返回错误,我会这样做:

input.setBorder(BorderFactory.createLineBorder(Color.RED));

这是这个应用程序 UI 中使用的惯例,早在我之前就开始了,所以我没有太多选择,只能使用其他方式来吸引用户的注意力(希望我这样做了)。这就是它的工作方式。

问题是,一旦用户返回并在文本字段中输入有效内容,我需要一种方法将其设置回默认边框(而不是仅仅将其设置为 Color.GRAY 或其他颜色,这是一种不同的颜色从其原始边界)。我需要一种方式来表达“移除多余的装饰并恢复正常”,或者只是将边框设置为默认值。

【问题讨论】:

    标签: java user-interface validation swing


    【解决方案1】:

    您不能直接调用input.getBorder() 并将其缓存在某处,然后再将边框设置为红色吗?

    【讨论】:

    • 是的,我可以,我在问这个问题后几乎立即意识到这一点。出于某种原因,我没有在 API 规范中看到 getBorder(),尽管它显然存在。我需要休息一下。
    • 为什么要保存可以计算的东西呢?让外观和感觉为您服务。
    【解决方案2】:

    或者在不缓存任何内容的情况下,您可以通过 component.updateUI 告诉 JComponent 将其 UI 更新回外观的默认值。这应该使组件重置其颜色、边框、字体等以匹配原始设置。

    【讨论】:

    • 我更喜欢这种方法,但它对我不起作用。此代码将其设置为红色边框,但即使在调用 updateUI() 后仍将其保留在那里。 if(super.verify(input)) input.updateUI();否则 input.setBorder(redBorder);我猜这个缓存选项不太优雅
    • 有趣。也许它还需要无效/验证/绘画?这就是 SwingUtilities.updateComponentTreeUI(c) 所做的。
    • 任何想使用这种方法的人都知道——它有效,只是你必须在调用component.updateUI()之前调用component.setBorder(null)
    【解决方案3】:

    input.getBorder()

    如果没有人看到这个并且我没有因为问这个问题而受到应得的殴打而逍遥法外,那不是很棒吗?

    【讨论】:

      【解决方案4】:

      不确定您的系统是如何构建的,但我认为您可以在更改之前存储原始边框。所以你可以稍后再改回来

      // assuming the Border was not null before
      if (!super.verify(input)) {
          original = input.getBorder();
          input.setBorder(...);
      } else {
          if (original != null) {
              input.setBorder(original);
              original = null;  // not needed
          }
      }
      

      【讨论】:

        【解决方案5】:

        更改时需要保留现有边框。

        一种方法是使用 putClientProperty() 和 getClientProperty() 方法,您可以在 API 中找到这些方法。

        【讨论】:

          【解决方案6】:

          另一种可能性,如果您只需要几个输入小部件,那就是子类化,例如JTextField,添加setBorderOverride(),修改getBorder()如果不为null则返回"overriddingBorder"。

          然后你只需使用 setBorderOverride(redBorder) 将其变为红色并使用 setBorderOverride(null) 将其清除。

          这当然取决于绘画是否使用 getBorder(),它可能会也可能不会,以及哪个可能是特定于实现的。

          【讨论】:

            【解决方案7】:

            顺便说一下,您只需要一个对边框的静态引用——它是所有 JTextField 使用的同一个边框实例。

            【讨论】:

              猜你喜欢
              • 2012-11-05
              • 2015-02-25
              • 2015-08-24
              • 1970-01-01
              • 1970-01-01
              • 2014-07-02
              • 2012-08-09
              • 2016-02-14
              • 1970-01-01
              相关资源
              最近更新 更多