此paintComponent覆盖意味着什么?

时间:2018-09-10 21:26:02

标签: java swing

免责声明:这几天我经常使用Java,但是主要是数据处理,算法方面的工作,以及非常强调 not 图形或UX的东西。我对高强度视频游戏的想法是8位Pong。

我在应用程序中遇到了这段代码。我无法弄清楚这个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);
    }
};

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

该代码相当古老-是在Java 1.5时代编写的-但该应用程序始终在当前JRE(本文撰写时为Java 8和9)下运行。从未有任何有关密码字段的视觉怪异报告。该字段显示在其他无聊的JPanel中。

代码的作者离开公司已经很久了。实际上,在我到达之前,提交人的替代人已经离开了公司。我不认为任何参与此部分代码的人都在这里工作,所以没有人问。 (我被要求为这样的团队做很多事情。)我发现他们的许多旧代码很容易受到追捧,因为他们是从其他地方的随机项目中复制过来的公司,所以可能更多。

本着“用棍子戳它,看看有什么坏处”的精神,我做了一些非常基本的摆弄:用getBackground()替换Color.MAGENTA来查看软件中是否有任何东西变成了粉红色,然后删除匿名子类,以查看是否有任何东西变成梨形等。在Windows上,所有更改似乎都没有任何明显的区别。

当然,缺乏证据与缺乏证据以及所有这些,我无法证明某些地方某个平台上不需要它。但我想添加一条评论,说明“ old”的作者可能一直在尝试做的事情...

1 个答案:

答案 0 :(得分:4)

  

似乎正在尝试使用当前背景色填充某些区域,但是“剪切边界”应该位于何处以及为什么还不会发生,这超出了我的经验。在源文件的其余部分搜索“剪辑”没有任何结果。

“剪辑”实际上是由Graphics上下文定义的,并且在大多数情况下,无论如何它都被定义为组件边界的大小,尽管在某些情况下它可以用来提高绘画速度,没有更多上下文的话,这里不会带来很多好处

您可以查看Painting in AWT and Swing了解更多详细信息

  

代码相当古老-编写于Java 1.5时代

从1.3开始,我就一直在使用Swing进行写作,但从未发现需要做这样的事情

由于paintComponent的一项工作通常是绘制背景,对于基于文本的组件,文本似乎没有任何作用。

  

已经发现他们的许多旧代码是易货的,因为它们是从公司其他地方的某个随机项目中复制过来的,因此可能更多。

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

我认为可以安全地删除它而没有任何副作用