Java LibGdx标签文本换行错误?

Java LibGdx标签文本换行错误?,java,libgdx,Java,Libgdx,我使用启用了文本换行的标签。在这种情况下,文本换行错误。文本将换行为3行,此时文本应仅为2行,标签大小仅反映这2行。我对代码进行了调试,并在Label.layout()方法中找到了原因。不确定这是一个bug还是我做错了什么 在下面的代码中,您可以看到文本被两次设置为GlyphLayout。第一次正确包裹,第二次我们使用缩小的宽度,它像以前一样包裹成更多的线。我认为第二次我们将文本设置到GlyphLayout中时,应该使用相同的宽度 public class Label extends Widge

我使用启用了文本换行的标签。在这种情况下,文本换行错误。文本将换行为3行,此时文本应仅为2行,标签大小仅反映这2行。我对代码进行了调试,并在Label.layout()方法中找到了原因。不确定这是一个bug还是我做错了什么

在下面的代码中,您可以看到文本被两次设置为GlyphLayout。第一次正确包裹,第二次我们使用缩小的宽度,它像以前一样包裹成更多的线。我认为第二次我们将文本设置到GlyphLayout中时,应该使用相同的宽度

public class Label extends Widget {

   public void layout () {
      ...

      float width = getWidth(), height = getHeight();
      ...

      GlyphLayout layout = this.layout;
      float textWidth, textHeight;
      if (wrap || text.indexOf("\n") != -1) {
         // Set the text into the GlyphLayout. The text is wrapped correctly here
         layout.setText(font, text, 0, text.length, Color.WHITE, width, lineAlign, wrap, ellipsis);
         textWidth = layout.width;
         textHeight = layout.height;

         ...
      } else {
         textWidth = width;
         textHeight = font.getData().capHeight;
      }

      ...

      // Set the text again into the GlyphLayout. This time with the width that we got when we set it the first time
      // This time the text is wrapped wrong as it uses less width as it should
      layout.setText(font, text, 0, text.length, Color.WHITE, textWidth, lineAlign, wrap, ellipsis);
      ...
   }
}

确保
invalidate()
标签,然后
pack()
标签,以便它计算任何新的首选尺寸;这可能解决问题,也可能无法解决问题

查看
Label
的源代码,您可以看到无论文本是否换行,最后一次调用
layout.setText()
总是被调用

前面的
layout.setText()
调用用于为实际使用这些值的后面调用设置
textWidth
textWidth

如果启用换行或有换行符,则宽度和高度设置为标签的宽度和高度;如果禁用换行,则宽度设置为实际文本宽度,高度设置为字体数据高度

从上面可以看出,另一个可能导致这种情况发生的问题是您是否缩放了字体和/或标签。未从
Label.layout()
中应用缩放因子,这可能导致标签大小为2行,而实际文本为3行,因为宽度不允许在包装设置为on时溢出

如果所有这些都失败了,我将确保您的字体文件是正确的,并且您的文本中没有任何字符或数据可能导致出现新行

我还建议使用另一种同样字形宽度和高度的字体,看看问题是否仍然存在。如果没有,那么至少你知道这是与字体有关的问题,而不是与标签有关的问题


希望这对您有所帮助。

这个问题已经在libgdx 1.9.12中解决了

我以前也从未见过。它只发生在这一种情况下。我有点困惑,prefSize是Label中的一个私有字段,不能从外部设置。它在标签内进行计算。此外,我没有设置任何宽度或高度的标签无论如何。它嵌套在表中,并从表中获取宽度。高度是根据文本及其包装的行数来计算的。另外,我确实知道第一次调用layout.setText()是为了获得文本的宽度和高度,但是为什么第二次使用这种缩小的大小呢?我们还有同样尺寸的。如果我们第二次使用不同的宽度和高度,可以预期文本将以不同的方式分解,不是吗?非常感谢您的帮助!不幸的是,这没有帮助。实际上,我把它归结为文本包装中的浮点问题。事实证明,在Java
251.40002f+10.8f-10.8f=251.40001f
中,存在一个问题,导致我的行的最后一个字在第二次布局时出现故障。setText()被称为nice find,对不起,我帮不上忙。不用担心。我很感激周围有人想帮忙!