java - 在自定义控制台中显示多行 JLabels?
问题描述
我正在为我正在开发的游戏开发自定义控制台,但是当它尝试显示长消息时,它会在末尾添加“..”并且不显示整个消息,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返回。
如果您使用 LayoutManager,则不必自己计算位置和大小。在您的情况下,垂直 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 对象会浪费内存。)
推荐阅读
- javascript - 对对象数组中的嵌套对象值求和
- javascript - 在 JavaScript 中将数据导出为 CSV
- android - 按钮颜色和渐变的功能
- perl - 无法在 perl 中获取 YAML 文档节点
- awk - awk zip 行,如 python zip
- android - 毕加索没有在 ImageView 上加载图像
- python - 加载模型和应用预测的正确方法
- java - 使用 if else 语句进行 JOptionPane 输入验证
- php - Query Join table to sort by menudindex
- java - eclipselink的级联删除问题