Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Swing中重置/删除边框_Java_User Interface_Validation_Swing - Fatal编程技术网

Java 在Swing中重置/删除边框

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

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

最近,我被要求在工作中维护一些旧的Java Swing GUI代码,但遇到了以下问题:

我已经将自己的InputVerifier子类MyFilenameVerifier附加到JTextField(但出于这些目的,它也可以是任何JComponent)。我已经重写了verify()方法,因此它调用了super.verify(输入)(其中输入是要验证()的JComponent参数)。如果
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)