java fillrect_Java graphics2D fillRect无法使用半透明颜色正常...

我正在编写一个带有一些自定义渲染的程序,并且需要渲染一个带边框的矩形.我决定简单地调用graphics2D.fillRect(),切换到边框颜色,并调用graphics2D.drawRect().但是,即使我使用相同的坐标和大小重新调用这些调用,当我绘制的颜色是半透明的(具有alpha)时,fillRect()并不总是填充drawRect包含的整个区域.此外,fillRect()绘制的区域有时位于drawRect()包含的区域之外.为什么这两种方法在给定不同颜色时会在不同的地方绘制东西?

这是一个演示问题的示例.在窗口中单击鼠标将在使用alpha和不使用alpha绘制填充之间切换.请注意,在使用alpha绘制时,矩形底部有一行像素为白色,但在没有alpha绘图时,该行像素不存在.

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.geom.AffineTransform;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class ColorWithAlpha extends JPanel {

private boolean hasAlpha = true;

private static final long serialVersionUID = 1L;

/**

* @param args

*/

public static void main(String[] args) {

// setup a basic frame with a ColorWithAlpha in it

JFrame frame = new JFrame();

JPanel panel = new ColorWithAlpha();

panel.setPreferredSize(new Dimension(500, 500));

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(panel);

frame.pack();

frame.show();

}

public ColorWithAlpha() {

super();

setBackground(Color.WHITE);

this.addMouseListener(new MouseListener() {

@Override

public void mouseClicked(MouseEvent arg0) {

// when the user clicks their mouse, toggle whether we are drawing a color with alhpa or without.

hasAlpha = !hasAlpha;

ColorWithAlpha.this.repaint();

}

@Override

public void mouseEntered(MouseEvent arg0) {}

@Override

public void mouseExited(MouseEvent arg0) {}

@Override

public void mousePressed(MouseEvent arg0) {}

@Override

public void mouseReleased(MouseEvent arg0) {}

});

}

@Override

public void paintComponent(Graphics g) {

super.paintComponent(g);

Color color = new Color(100, 100, 250);// this color doesnt have an alpha component

// some coordinates that demonstrate the bug. Not all combinations of x,y,width,height will show the bug

int x = -900;

int y = 1557;

int height = 503;

int width = 502;

if (hasAlpha) { // toggle between drawing with alpha and without

color = new Color(200, 100, 250, 100);

}

Graphics2D g2 = (Graphics2D) g;

// this is the transform I was using when I found the bug.

g2.setTransform(new AffineTransform(0.160642570281124, 0.0, 0.0, -0.160642570281124, 250.0, 488.0));

g2.setColor(color);

g2.fillRect(x, y, width, height);

g2.setColor(Color.DARK_GRAY);

g2.setStroke(new BasicStroke(8f));

g2.drawRect(x, y, width, height);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值