Java 是否可以在不调用add()或创建JLabel图像的情况下绘制JLabel?
具体来说,我想将JLabel的内容绘制到图形对象上。 我不想将标签添加到任何框架或面板!请查看评论以获得进一步解释 经过研究,我找到了一种方法。例如,我有一个标签,我画成x=100,y=100Java 是否可以在不调用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
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