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中的阴影显示不正确_Java_User Interface - Fatal编程技术网

Java中的阴影显示不正确

Java中的阴影显示不正确,java,user-interface,Java,User Interface,我正在尝试用Java创建一个类,它将向任何给定的UI元素添加一个简单的框阴影。通常情况下,它会正确显示,但是当它应用于按钮时,每次鼠标进入或退出按钮时,阴影都会变暗 绘制功能如下所示: public void paint(Graphics g) { Rectangle bounds = g.getClipBounds(); g.setClip(bounds.x + (SHADOW_OFFSET + shadowOffsetMod) - (SHADOW_SIZE + shadow

我正在尝试用Java创建一个类,它将向任何给定的UI元素添加一个简单的框阴影。通常情况下,它会正确显示,但是当它应用于按钮时,每次鼠标进入或退出按钮时,阴影都会变暗

绘制功能如下所示:

public void paint(Graphics g)
{
    Rectangle bounds = g.getClipBounds();

    g.setClip(bounds.x + (SHADOW_OFFSET + shadowOffsetMod) - (SHADOW_SIZE + shadowSizeMod), bounds.y + (SHADOW_OFFSET + shadowOffsetMod) - (SHADOW_SIZE + shadowSizeMod),
            bounds.width + 2 * (SHADOW_SIZE + shadowSizeMod), bounds.height + 2 * (SHADOW_SIZE + shadowSizeMod));

    int red = UIConstants.SHADOW_COLOR.getRed();
    int green = UIConstants.SHADOW_COLOR.getGreen();
    int blue = UIConstants.SHADOW_COLOR.getBlue();
    int alpha = UIConstants.SHADOW_COLOR.getAlpha();

    for (int x = (SHADOW_OFFSET + shadowOffsetMod) - (SHADOW_SIZE + shadowSizeMod); x < bounds.width + (SHADOW_OFFSET + shadowOffsetMod) + (SHADOW_SIZE + shadowSizeMod); x++)
    {
        for (int y = (SHADOW_OFFSET + shadowOffsetMod) - (SHADOW_SIZE + shadowSizeMod); y < bounds.width + (SHADOW_OFFSET + shadowOffsetMod) + (SHADOW_SIZE + shadowSizeMod); y++)
        {
            int dx = Math.abs(x - Math.max(Math.min(x, bounds.width + (SHADOW_OFFSET + shadowOffsetMod)), (SHADOW_OFFSET + shadowOffsetMod)));
            int dy = Math.abs(y - Math.max(Math.min(y, bounds.height + (SHADOW_OFFSET + shadowOffsetMod)), (SHADOW_OFFSET + shadowOffsetMod)));

            float dist = (float) Math.sqrt(dx * dx + dy * dy);
            dist /= (SHADOW_SIZE + shadowSizeMod);
            if (dist > 1)
                dist = 1;

            dist = 1 - dist;

            g.setColor(new Color(red, green, blue, ((float)alpha * dist) / 255));
            g.fillRect(x, y, 1, 1);
        }
    }

    g.setClip(bounds);

    super.paint(g);
}
public void绘制(图形g)
{
矩形边界=g.getClipBounds();
g、 setClip(bounds.x+(SHADOW\u OFFSET+shadowOffsetMod)-(SHADOW\u SIZE+shadowSizeMod),bounds.y+(SHADOW\u OFFSET+shadowOffsetMod)-(SHADOW\u SIZE+shadowSizeMod),
bounds.width+2*(阴影大小+阴影大小),bounds.height+2*(阴影大小+阴影大小));
int red=UIConstants.SHADOW_COLOR.getRed();
int green=UIConstants.SHADOW_COLOR.getGreen();
int blue=UIConstants.SHADOW_COLOR.getBlue();
int alpha=UIConstants.SHADOW_COLOR.getAlpha();
对于(int x=(SHADOW\u OFFSET+shadowOffsetMod)-(SHADOW\u SIZE+shadowSizeMod);x1)
dist=1;
距离=1-距离;
g、 setColor(新颜色(红色、绿色、蓝色,((浮动)alpha*dist)/255));
g、 fillRect(x,y,1,1);
}
}
g、 setClip(边界);
超级油漆(g);
}
每次鼠标进入或退出按钮时,阴影都会变暗

不确定您的代码是如何使用的。但是(假设您使用的是usign Swing),这是由于使用具有透明度的背景色而导致的问题

Swing组件是

  • 不透明,在这种情况下,它们保证绘制背景
  • 非不透明,在这种情况下,父组件用于绘制背景
  • 在您的情况下,听起来组件是不透明的,但背景是透明的,所以您违反了规则,并且存在绘画问题

    查看更多信息和一些解决方案:

  • 使组件不不透明,并自己绘制背景
  • 使用自定义组件作为包装为您绘制背景

  • 您的组件上是否有任何
    mouseSteners
    MouseMotionListeners
    鼠标侦听器?是的,我有鼠标侦听器,但禁用它们并不能解决问题。只有按钮被重新绘制,因此您在按钮周围的区域重复绘制,每次颜色变暗,但不会重置为原始颜色。您可能需要告诉父组件重新绘制/更新区域。