是否可以在不调用add()或创建图像的情况下绘制JLabel?

时间:2013-11-20 02:31:25

标签: java performance swing jlabel

具体来说,我想将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等来影响它。

1 个答案:

答案 0 :(得分:0)

好的,我找到了一种方法来实现我想要的结果。

由于

label.paint(graphics);

不接受x和y参数,另一种方法(将其绘制到新的BufferedImage并绘制它)效率不高,可以调用Graphics#translate(x,y)来改变Graphics对象的原点。

E.g。要将我的标签绘制为100,100,这就完成了工作:

graphics.translate(100, 100);
label.paint(graphics);
graphics.translate(-100, -100); //set origin back to 0, 0 for following calls

当然这适用于所有其他组件。