Java 这个组件覆盖的目的是什么?

Java 这个组件覆盖的目的是什么?,java,swing,Java,Swing,免责声明:我现在做了很多Java,但它主要是数据处理、算法方面的东西,而不是图形或UX方面的东西。我对高强度视频游戏的想法是8位乒乓球 我在一个应用程序中遇到了这段代码。我想不出这个paintComponent要解决什么问题 JPasswordField pass = new JPasswordField(35) { @Override protected void paintComponent (Graphics g) { g.setColor(getBackg

免责声明:我现在做了很多Java,但它主要是数据处理、算法方面的东西,而不是图形或UX方面的东西。我对高强度视频游戏的想法是8位乒乓球

我在一个应用程序中遇到了这段代码。我想不出这个
paintComponent
要解决什么问题

JPasswordField pass = new JPasswordField(35) {
    @Override
    protected void paintComponent (Graphics g) {
        g.setColor(getBackground());
        Rectangle r = g.getClipBounds();
        g.fillRect (0, 0, r.width, r.height);
        super.paintComponent(g);
    }
};
看起来它试图用当前的背景色填充某些区域,但“剪辑边界”应该在哪里,以及为什么不会发生,这超出了我的经验。在源文件的其余部分搜索“clip”时没有得到任何结果

代码相当陈旧——编写于Java1.5时代——但应用程序始终在当前的JRE下运行(撰写本文时为Java8和Java9)。从未有任何关于密码字段的视觉异常报告。该字段显示在另一个无聊的JPanel中

代码的作者早已离开公司。事实上,在我到达之前,作者的替代者已经离开了公司。我不相信任何涉及这段代码的人仍然在这里工作,所以没有人可以问。(我被叫去为这样的团队做了很多工作。)我发现他们的很多旧代码都是cargo cult风格的,因为他们是从公司其他地方的一些随机项目中复制过来的,所以这可能更相似

本着“用棍子戳一下,看看有什么东西坏了”的精神,我做了一些非常基本的摆弄:用
Color.MAGENTA
替换
getBackground()
,看看软件中是否有任何东西变成了强烈的粉红色,将匿名子类全部删除,看看是否有任何东西变成了梨形,所有这些变化似乎都没有对Windows产生任何明显的影响

当然,缺乏证据与缺乏证据等等,我无法证明在某个平台上不需要它。但我想补充一点,说明《老》的作者可能一直在试图做什么

看起来它试图用当前的背景色填充某些区域,但“剪辑边界”应该在哪里,以及为什么不会发生,这超出了我的经验。在源文件的其余部分搜索“clip”时没有得到任何结果

“剪辑”实际上是由
图形
上下文定义的,在大多数情况下,它被定义为组件边界的大小,尽管在某些场景中它可以用来提高绘制速度,但如果没有更多上下文,我看不出它有多大好处

您可以查看更多详细信息

这段代码相当古老——是在Java1.5时代编写的

我从1.3开始就在Swing中写作,从未发现有必要这样做


由于
paintComponent
的工作之一是典型地绘制背景,而对于基于文本的组件,文本,代码似乎什么也没做

他们发现很多旧代码都是cargo cult风格的,因为他们是从公司其他地方的一些随机项目中复制过来的,所以这可能更相似

这可能是一个很好的评估,它可能曾被用于尝试在某个点显示占位符文本,并被修改为您现在看到的内容。。。胡乱猜测

我认为可以肯定地说,你可以去掉它而不产生任何副作用

看起来它试图用当前的背景色填充某些区域,但“剪辑边界”应该在哪里,以及为什么不会发生,这超出了我的经验。在源文件的其余部分搜索“clip”时没有得到任何结果

“剪辑”实际上是由
图形
上下文定义的,在大多数情况下,它被定义为组件边界的大小,尽管在某些场景中它可以用来提高绘制速度,但如果没有更多上下文,我看不出它有多大好处

您可以查看更多详细信息

这段代码相当古老——是在Java1.5时代编写的

我从1.3开始就在Swing中写作,从未发现有必要这样做


由于
paintComponent
的工作之一是典型地绘制背景,而对于基于文本的组件,文本,代码似乎什么也没做

他们发现很多旧代码都是cargo cult风格的,因为他们是从公司其他地方的一些随机项目中复制过来的,所以这可能更相似

这可能是一个很好的评估,它可能曾被用于尝试在某个点显示占位符文本,并被修改为您现在看到的内容。。。胡乱猜测


我认为可以肯定地说,您可以在不排除任何副作用的情况下删除它

,因为
paintComponent
的工作之一是典型地绘制背景,对于基于文本的组件,文本、代码似乎做得很好,什么都没有。因为
paintComponent
的工作之一就是典型地绘制背景,而对于基于文本的组件,文本,代码似乎什么都没有做。这是一个方便的链接,肯定会保留下来供进一步研究。干杯这是一个方便的链接,一定要保留下来以便进一步研究。干杯