Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在不调用add()或创建JLabel图像的情况下绘制JLabel?_Java_Performance_Swing_Jlabel - Fatal编程技术网

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

Java 是否可以在不调用add()或创建JLabel图像的情况下绘制JLabel?,java,performance,swing,jlabel,Java,Performance,Swing,Jlabel,具体来说,我想将JLabel的内容绘制到图形对象上。 我不想将标签添加到任何框架或面板!请查看评论以获得进一步解释 经过研究,我找到了一种方法。例如,我有一个标签,我画成x=100,y=100 public void drawIt(Graphics graphics) { Dimension size = label.getPreferredSize(); BufferedImage image = new BufferedImage(size.width, size.heigh

具体来说,我想将JLabel的内容绘制到图形对象上。 我不想将标签添加到任何框架或面板!请查看评论以获得进一步解释

经过研究,我找到了一种方法。例如,我有一个标签,我画成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();
}
这很好,但有一个主要的后遗症: 当我在任何JFrame或JPanel等中的paint方法中调用它时,它的速度非常慢,并且占用了大量内存。此外,通常应避免在绘制方法中分配图像对象

召唤

label.paint(graphics);

工作良好且快速,但调用此方法总是在坐标0,0处绘制标签,这是我无法通过设置位置等来影响的。

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

不接受x和y参数,另一种方法是将其绘制到新的BuffereImage并绘制。这不是很有效,可以调用Graphicstranslatex,y来更改图形对象的原点

例如,要将我的标签涂成100,100,这将完成以下工作:

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

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

是否有理由必须绘制JLabel而不是绘制样式文本?请接受,不要讨论此问题。-???请至少为这个不寻常的请求提供一些理由。请不要把规定放在志愿者提供的免费建议上。@abmitchell我想在一个特定的矩形中通过抽绳写很多文本。文本宽度大于矩形宽度后需要换行。它应该尝试在空格后包装单词,并打断矩形中过长的单词。然而,我想要的是像在JLabel中一样绘制一个字符串。@hoverCraftFullOfels我想要将我的代码包装在一个可重用的类中,以便在多个项目之间共享。例如,在某个项目的JFrame的paintComponent方法中,我只想调用WrappedTextDrawer.drawgraphics、longText、x、y、width、height,不想随意添加大量JLabel。我不想随意添加大量。。。在我看来,这就像是一个早熟优化与2个我称之为算法固定的东西相结合的例子。换句话说,你有你想要的方法去做,不管它是否是个好主意,不管它是否能解决你最初的问题。
graphics.translate(100, 100);
label.paint(graphics);
graphics.translate(-100, -100); //set origin back to 0, 0 for following calls