Java 在Swing中重置/删除边框
这里有一个非常具体的编码问题: 最近,我被要求在工作中维护一些旧的Java Swing GUI代码,但遇到了以下问题: 我已经将自己的InputVerifier子类MyFilenameVerifier附加到JTextField(但出于这些目的,它也可以是任何JComponent)。我已经重写了verify()方法,因此它调用了super.verify(输入)(其中输入是要验证()的JComponent参数)。如果Java 在Swing中重置/删除边框,java,user-interface,validation,swing,Java,User Interface,Validation,Swing,这里有一个非常具体的编码问题: 最近,我被要求在工作中维护一些旧的Java Swing GUI代码,但遇到了以下问题: 我已经将自己的InputVerifier子类MyFilenameVerifier附加到JTextField(但出于这些目的,它也可以是任何JComponent)。我已经重写了verify()方法,因此它调用了super.verify(输入)(其中输入是要验证()的JComponent参数)。如果super.verify(input)返回false,我会: input.setBo
super.verify(input)
返回false,我会:
input.setBorder(BorderFactory.createLineBorder(Color.RED));
这是一个在我之前很久就开始的应用程序的整个UI中使用的约定,因此我没有太多的选择来使用其他方式来吸引用户的注意(但愿我这样做了)。这就是它的工作方式
问题是,一旦用户返回并在文本字段中键入有效的内容,我需要一种方法将其设置回默认边框(而不是只说将其设置为Color.GRAY或其他颜色,这与原始边框的颜色不同)。我需要一种方式来说,“删除额外的装饰并恢复正常”,或者只是将边框设置为默认值,换句话说。在将边框设置为红色之前,您不能调用并缓存它吗?不确定您的系统是如何构建的,但我认为您可以在更改它之前存储原始边框。所以你可以稍后再换回来
// 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
}
}
input.getBorder()
如果没有人看到这一点,而我没有因为问这个问题而受到应有的惩罚而逍遥法外,那岂不是太棒了?当你更改现有边界时,你需要保留它
实现这一点的一种方法是使用方法putClientProperty()和getClientProperty(),您可以在API中找到这些方法。顺便说一句,您只需要一个对边框的静态引用——它是所有JTextFields使用的同一个边框实例。另一种可能,如果只有少数几个输入小部件需要它作为子类,例如JTextField,则添加setBorderOverride()并修改getBorder()以返回“OverridingBorder”(如果它不为null) 然后您只需使用setOrderOverride(redBorder)将其设置为红色,使用setOrderOverride(null)将其清除
当然,这取决于使用getBorder()的绘制,它可以使用getBorder(),也可以不使用getBorder(),这可能是特定于实现的。或者在不缓存任何内容的情况下,您可以告诉JComponent通过component.updateUI将其UI更新回外观的默认设置。这将使组件重置其颜色、边框、字体等,以匹配原始设置。是的,我可以,在问了这个问题后,我几乎立即意识到了这一点。因此,我在API规范中没有看到getBorder(),尽管它显然在那里。我需要休息一下。为什么要保存一些你可以计算的东西呢?让外观和感觉适合你。我更喜欢这种方法,但它不适合我。这段代码将其设置为红色边框,但即使在调用updateUI()之后也会将其保留在那里。if(super.verify(input))input.updateUI();else输入.设置订单(红色边框);对于这一个,使用不太优雅的缓存选项我觉得很有趣。可能还需要失效/验证/绘制?这就是SwingUtilities的外观。updateComponentTreeUI(c)就是这样做的。任何想使用这种方法的人都知道,它是有效的,只需在调用
组件.updateUI()之前调用组件.setBorder(null)