在自定义控制台中显示多行JLabel?

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

我正在为自己正在开发的游戏使用自定义控制台,但是当它尝试显示长消息时,它会在末尾添加“ ..”,而不会显示整个消息,因此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的大小,但不会对其文本起作用

java string swing jframe jlabel
1个回答
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像素;它表示1/4英寸,显示多少像素取决于用户显示器的点距。

可以尝试自己计算一下,但是如果让LayoutManager(如Box内部使用的LayoutManager)执行其工作,Swing已经可以完成所有工作。

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

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