【问题标题】:Java sampling pixel color in swing摆动中的Java采样像素颜色
【发布时间】:2009-07-03 00:29:51
【问题描述】:

我必须创建一个特殊的 TextFieldUI 来绘制图像作为背景。该图像包含一些 alpha 分量。但是,每当在该文本字段中写入字符时,它首先会重新绘制背景,然后再绘制字符。当背景不包含 alpha 分量时这很好,但在键入几个字符后,alpha 区域加起来变成黑色。

我能看到的唯一方法是在 TextfieldUI 的 paintBackground 方法中(我将覆盖它),我必须首先在该位置对背景颜色进行采样,绘制该颜色的整个图形组件,然后画我的背景。

  1. 当我只能访问 Graphics 对象时,有谁知道如何对像素的颜色进行采样?

  2. 除了在 TextfieldUI 中覆盖 paintBackground 之外,还有更好的方法来绘制自定义图像作为文本字段背景吗?

谢谢

【问题讨论】:

    标签: java swing


    【解决方案1】:

    我之前没有尝试过,但是 Swing 是建立在 AWT 之上的,Robot 类有一种方法可以在 AWT 中对特定像素进行采样

    【讨论】:

    • 所以我尝试了 Robot 类,它似乎可以工作,但是我在获取正确的像素位置时遇到了问题。我尝试了 component.getSreenLocation(),但这并没有给我正确的结果。有什么想法吗?
    • 当我使用 component.getLocationOnScreen() 并在 x-1, y-1 处对像素进行采样时,这非常有效
    • 我不确定,但我认为存在相对坐标与绝对坐标的问题。您可能以某种方式为其提供了相对坐标(例如,相对于此特定面板),然后是屏幕坐标。,
    • 好的,所以现在我有另一个问题,当重新绘制屏幕时,机器人从旧屏幕而不是新屏幕获取颜色。本质上,我想强制完全重绘,然后再次重绘。有什么想法吗?
    【解决方案2】:

    好吧,我不知道您在paintBackground 方法中的自定义代码是什么样的,但我会确保您在绘制图像之前填写文本字段背景。

    我会让您决定它是否“更好”,但您可以使用Background Panel,它允许您将图像添加到面板。然后将文本字段添加到面板(文本字段自动变为非透明,因此图像显示出来)。然后将面板添加到 GUI。

    如果这不起作用,那么最好有一个代码演示,这样我们就可以看到实际发生了什么。

    【讨论】:

    • JComponent 组件=getComponent();诠释宽度=component.getWidth(); int height=component.getHeight(); BufferedImage scaledImage=PreferencesDialog.scaleToFitWindow(image,width,height); g.drawImage(scaledImage,0,0,component);
    【解决方案3】:

    当您覆盖paintBackground 时,您首先调用超类版本,对吗?它已经设置了一个背景色矩形,可以让您的图像重新开始。

    而不是“采样”背景颜色,它可能已经是正确的(如果没有在本地设置,超类的paintBackground 代码会从父组件中获取它)。如果该默认值不正确,请在初始界面构造中设置它。 (你的字段没有覆盖在其他未知纯色的复杂任意界面上,是吗?)

    【讨论】:

    • 不,我使用的是任意背景,这使得这个问题变得更加困难
    猜你喜欢
    • 2012-05-20
    • 2015-03-04
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多