gpt4 book ai didi

java - 在自定义控制台中显示多行 JLabels?

转载 作者:行者123 更新时间:2023-11-30 05:19:26 25 4
gpt4 key购买 nike

我正在为我正在开发的游戏开发一个自定义控制台,但是当它尝试显示长消息时,它会在末尾添加“..”并且不显示整个消息,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 大小,但对其文本没有影响

最佳答案

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

如果您使用布局管理器,您就不必自己计算位置和大小。在您的情况下, 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 个像素;它意味着 15⁄72 英寸,需要显示多少像素,这取决于用户显示器的点距。

可以尝试自己计算,但如果您让 LayoutManager(如 Box 内部使用的布局管理器)完成其工作,Swing 就已经完成了所有工作。

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

关于java - 在自定义控制台中显示多行 JLabels?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59800593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com