这是一个非常具体的编码问题:
我最近被要求在工作中维护一些旧的Java Swing GUI代码并遇到这个问题:
我已将我自己的InputVerifier子类MyFilenameVerifier附加到JTextField(但它也可能是用于这些目的的任何JComponent)。我重写了verify()方法,使其调用 super.verify(input)
(其中input是要验证()的JComponent参数。如果 super.verify(input)
返回false,我会这样做:
input.setBorder(BorderFactory.createLineBorder(Color.RED));
这是在我之前很久就开始使用的这个应用程序的UI中使用的约定,因此我没有很多选择,只要使用其他方式来吸引用户注意(希望我这样做)。这就是它的工作方式。
问题是,一旦用户返回并在文本字段中输入有效内容,我需要一种方法将其设置回默认边框(而不是仅仅将其设置为Color.GRAY或其他任何颜色,这是一种不同的颜色从它原来的边界)。我需要一种方式来说,“删除额外的装饰并恢复正常”或者只是将边框设置为默认值,换句话说。
答案 0 :(得分:5)
在将边框设置为红色之前,您是否只能调用input.getBorder()
并将其缓存到某处?
答案 1 :(得分:5)
或者,如果没有缓存任何内容,您可以告诉JComponent通过component.updateUI将其UI更新回到外观的默认值。这应该使组件重置其颜色,边框,字体等以匹配原始设置。
答案 2 :(得分:3)
input.getBorder()
如果没有人看过这个并且我没有受到殴打而自由离开我是否应该提出这个问题,那会不会很棒?
答案 3 :(得分:1)
不确定您的系统是如何构建的,但我认为您可以在更改之前存储原始边框。所以你可以稍后再改变它
// 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
}
}
答案 4 :(得分:1)
更改时需要保留现有边框。
执行此操作的一种方法是使用putClientProperty()和getClientProperty()方法,您将在API中找到这些方法。
答案 5 :(得分:1)
另一种可能性,如果只需要一些输入小部件,则需要进行子类化,例如JTextField,添加setBorderOverride()并修改getBorder()以返回“overriddingBorder”(如果它不为null)。
然后你只需使用setBorderOverride(redBorder)使其变为红色并使用setBorderOverride(null)来清除它。
这当然取决于使用getBorder()的绘画,它可能会或可能不会,以及哪些可能是特定于实现的。
答案 6 :(得分:0)
顺便提一下,你只需要一个静态引用边框 - 它是所有JTextFields使用的同名边框实例。