java这个组件重写的目的是什么?
免责声明:我现在做了很多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产生任何明显的影响
当然,缺乏证据与缺乏证据等等,我无法证明在某个平台上不需要它。但我想补充一点,说明《老》的作者可能一直在试图做什么
# 1 楼答案
“clip”实际上是由
Graphics
上下文定义的,在大多数情况下,它被定义为组件边界的大小,尽管在某些场景中它可以用来提高绘制速度,但如果没有更多上下文,我看不到它有多大好处您可以查看Painting in AWT and Swing了解更多详细信息
我从1.3开始就在Swing中写作,从未发现有必要这样做
由于
paintComponent
的工作之一通常是绘制背景,而对于基于文本的组件,则是文本,因此代码似乎什么也没做这可能是一个很好的评估,它可能曾被用于尝试在某个点显示占位符文本,并被修改为您现在看到的内容。。。胡乱猜测
我认为可以肯定地说,你可以去掉它而不产生任何副作用