具体来说,我想将JLabel的内容绘制到Graphics对象上。我不想将标签添加到任何框架或面板!请查看评论以获得进一步的解释。
经过一番研究,我发现了一种方法。例如,我有一个标签,我绘制到x = 100,y = 100。
public void drawIt(Graphics graphics)
{
Dimension size = label.getPreferredSize();
BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);
Graphics imageGraphics = image.createGraphics();
label.paint(imageGraphics);
graphics.drawImage(image, 100, 100, null);
imageGraphics.dispose();
}
这工作正常,但有一个主要的反向:当我在一个paint方法(在任何JFrame或JPanel等)中调用它时,它非常慢并且使用大量内存。 Afaik,通常要避免在paint方法中分配(图像)对象。
调用
label.paint(graphics);
工作得很好,但是调用这个方法总是在坐标0,0处绘制标签,我不能通过setLocation等来影响它。
好的,我找到了一种方法来实现我想要的结果。
以来
label.paint(graphics);
不接受x和y参数,另一种方法(将其绘制到新的BufferedImage并绘制它)效率不高,可以调用Graphics#translate(x,y)来改变Graphics对象的原点。
例如。把我的标签画到100,100,这样做的工作:
graphics.translate(100, 100);
label.paint(graphics);
graphics.translate(-100, -100); //set origin back to 0, 0 for following calls
当然,这应该适用于所有其他组件。