Java 我可以吗;“保存”;Graphics2D绘制的图像不会受到后续使用DstOut合成的影响?

Java 我可以吗;“保存”;Graphics2D绘制的图像不会受到后续使用DstOut合成的影响?,java,swing,graphics,Java,Swing,Graphics,我正在基于swing JFrame进行自己的UI设计。 我制作的按钮元素是使用DstOut AlphaComposite在鼠标按住按钮时在白色填充上“雕刻”文本。它用白色填充按钮区域,然后用DstOut绘制按钮文本,使背景通过雕刻文本的区域可见。为此,我创建了一个BuffereImage实例,在其中绘制按钮,然后雕刻文本。完成图像后,我将其绘制在按钮应位于的位置 我的问题是,我可以在不创建单独的BuffereImage对象的情况下执行此操作吗? 上述方法对我有一个缺点-所有的图形设置都被重置。

我正在基于swing JFrame进行自己的UI设计。 我制作的按钮元素是使用DstOut AlphaComposite在鼠标按住按钮时在白色填充上“雕刻”文本。它用白色填充按钮区域,然后用DstOut绘制按钮文本,使背景通过雕刻文本的区域可见。为此,我创建了一个BuffereImage实例,在其中绘制按钮,然后雕刻文本。完成图像后,我将其绘制在按钮应位于的位置

我的问题是,我可以在不创建单独的BuffereImage对象的情况下执行此操作吗?

上述方法对我有一个缺点-所有的图形设置都被重置。消除混叠是一个很简单的事情再次设置,但我也计划使用缩放和平移动画场景过渡

如果我在绘制整个窗口之前使用g.scale(4,4),所有内容都会变大4倍,但BuffereImage仍然将1像素视为1像素,不知道它将被放大。当在屏幕上绘制BuffereImage时,会进行放大,但绘制BuffereImage的内容时不会进行放大。这使得放大后的图片看起来很糟糕,因为放大了低分辨率图片(现在每个像素的面积为16像素)

正如您在屏幕截图上看到的,第一个按钮的外观看起来不错,但第二个按钮使用BuffereImage绘制其边框(处于扩展动画状态)看起来很糟糕

对我来说,一个完美的解决方案是,在开始绘制按钮之前,防止AlphaComposite.d接触绘制的任何东西,但要使用相同的Graphics2D实例来保持包括缩放和平移的设置


如果这是不可能的,您能推荐一种获得相同结果的方法,但比仅仅添加平移和缩放来绘制方法参数并繁琐地处理它要好吗?

没有更多的上下文就有点难说了-理论上,您不需要缓冲图像,只需应用
AlphaComposite
,当你在
Graphics
的实例上完成渲染和重置合成时,你会渲染和重置合成吗?但是,我已经做过类似的事情,而且之前的大部分经验都是在多个图像上进行的。我首先绘制背景图片,然后绘制所有元素。如果我使用DstOut composite来清理像素(通过应用0 alpha的颜色),它也会清除我不需要的背景(并使窗口透明)。或者你的意思是我应该绘制背景图片,为所有要绘制的元素创建一个透明的缓冲区图像,然后在窗口中绘制它?这听起来很合理,我来试试。