重置/删除Swing中的边框

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

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

我已将我自己的InputVerifier的子类MyFilenameVerifier附加到JTextField(但它也可能是用于这些目的的任何JComponent)。 我重写了verify()方法,以便调用super.verify(input) (其中input是要validation()的JComponent参数。 如果super.verify(input)返回false,我会:

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

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

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

难道你不能只是调用input.getBorder()并在将边框设置为红色之前将其缓存到某个地方吗?

或者没有缓存任何东西,你可以告诉JComponent通过component.updateUI将其UI更新回到外观的默认值。 这应该使组件重置其颜色,边框,字体等以匹配原始设置。

input.getBorder()

如果没有人看过这个并且我没有屁股殴打而得到自由,我应该得到这个问题,这不是很棒吗?

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

 // 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 } } 

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

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

另一种可能性,如果你只需要一些输入小部件就是子类,例如JTextField,添加setBorderOverride()并修改getBorder()以返回“overriddingBorder”(如果它不是null)。

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

这当然取决于使用getBorder()的绘画,它可能会或可能不会,并且可能是特定于实现的。

顺便说一下,你只需要一个静态引用边框 – 它是所有JTextFields使用的同名边框实例。