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

问题描述 投票:-2回答:1

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

java performance swing jlabel
1个回答
0
投票

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

以来

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

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

© www.soinside.com 2019 - 2024. All rights reserved.