【问题标题】:Displaying multiline JLabels in custom console?在自定义控制台中显示多行 JLabels?
【发布时间】:2020-05-05 02:57:12
【问题描述】:

我正在为我正在开发的游戏开发自定义控制台,但是当它尝试显示长消息时,它会在末尾添加“..”并且不显示整个消息,JFrame 的尺寸是720x480,这里是没有计算的代码:

while ((line = in.readLine()) != null) {
    JLabel label = new JLabel(line, SwingConstants.LEFT);
    label.setBounds(5, currentLine*15, 720, 15);
    label.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 15));
    frame.add(label);
    frame.repaint();
    currentLine++;
}

这是它,但需要计算:

 while ((line = in.readLine()) != null) {
    JLabel label = new JLabel(line + " AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", SwingConstants.LEFT);
    double textWidth = label.getMaximumSize().getWidth();
    int lineSize = 1;
    lineSize = (int) Math.ceil(textWidth / 720);
    System.out.println(lineSize); // prints 2

    label.setBounds(5, currentLine*20, 720, lineSize*20);
    label.setMaximumSize(new Dimension(720, lineSize*20));
    label.setFont(ConsoleFont);
    frame.add(label);
    frame.repaint();
    currentLine += lineSize;
}

但不同之处在于,通过计算它会增加 JLabel 的大小,但不会影响它的文本

【问题讨论】:

  • 我如何得到它?
  • 1) 为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。硬编码数据替换(外部文件和)输入流。 2) Java GUI 必须在不同的语言环境中使用不同的 PLAF 在不同的操作系统、屏幕尺寸、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 ..
  • .. 3) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。

标签: java string swing jframe jlabel


【解决方案1】:

JLabel 已经知道显示其内容所需的大小。该大小由getPreferredSize 返回。

如果您使用 LayoutManager,您就不必自己计算位置和大小。在您的情况下,vertical Box 可能就足够了:

private Box linesContainer = Box.createVerticalBox();

private Font linesFont = new Font(Font.MONOSPACED, Font.PLAIN, 15);

// ...

    frame.add(linesContainer);

// ...

    while ((line = in.readLine()) != null) {
        JLabel label = new JLabel(line, SwingConstants.LEFT);
        label.setFont(linesFont);
        linesContainer.add(label);

        // Add spacing.
        linesContainer.add(Box.createVerticalStrut(3));

这是使用 LayoutManager 的另一个好理由:您不知道 15 磅字体在其他人的计算机上实际有多少像素高。 15 点不代表 15 像素;这意味着 ¹⁵⁄₇₂ 英寸,需要多少像素才能显示,这取决于用户显示器的点距。

可以尝试自己计算,但是如果您让 LayoutManager(如 Box 内部使用的那个)来完成所有工作,Swing 已经完成了所有工作。

(另请注意,我将 Font 的创建移到了循环之外。创建新的、相同的 Font 对象会浪费内存。)

【讨论】:

  • 没用,我试着计算高度,它工作了,但文本最后还是有 ..
  • 您能分享一个导致该问题的文本示例吗?
  • 这只是一行文字,但我结合了一个很长的“AAA...”文字来测试它
  • 您是否对 Box 的边界进行了硬编码?也许扩大范围会有所帮助?
  • 我将每行的大小增加到 20,但字体保持在 15
猜你喜欢
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
相关资源
最近更新 更多